第一节 集合和数组

1.1 为什么使用集合

数组缺点:长度固定,没有办法动态扩展

集合框架

集合框架简化图

1.2 Collection接口

第二节 List接口

特点:有序、允许重复

  • 有序集合(也称为序列 )。
    用户可以通过整数索引(列表中的位置)访问元素,并搜索列表中的元素。
    与set集合不同,列表通常允许重复的元素

2.2 ArrayList实现类

特点:动态数组;优势:随机查询(可以直接按索引访问)

  • 可调整大小的数组,实现了List接口
  • 每个ArrayList实例都有一个容量 。 容量是用于存储列表中的元素的数组的大小。 它总是至少与列表大小一样大。 当元素添加到ArrayList时,其容量会自动增长。
  • 线程不同步(非线程安全)
package com.test3;
​
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
​
public class Test1 {
​public static void main(String[] args) {//创建List对象List list = new ArrayList();//添加数据list.add(100);list.add("aaa");list.add(true);list.add(1.234);Student s=new Student("张三",20);list.add(s);//list中可以添加重复的数据list.add(100);list.add("aaa");//打印list中的数据//System.out.println(list);//删除数据//按数据删除//list.remove("aaa");//按索引删除//list.remove(3);//对于整数类型的数据删除时要转为Integer类型,否则系统会认为是按索引删除//Integer:是整形的包装类对象,也可以表示整数值,但是比int多了很多方法//list.remove(Integer.valueOf(100));//System.out.println(list);//批量删除//List rl =new ArrayList();//rl.add(true);//rl.add(1.234);//rl.add("aaa");//list.removeAll(rl);//System.out.println(list);//遍历数据//第一种:使用索引方式循环遍历/*for(int i=0;i<list.size();i++){Object o = list.get(i);if(o instanceof Student){Student stu=(Student)o;System.out.println("学生信息:"+stu.getName());}System.out.println(o);}*///第二种方式:for in迭代  ,不需要知道集合的长度/*for(Object o : list){//逐一取出list中的数据,存储到临时变量o中,然后使用变量System.out.println(o);}*///第三种方式:Iteraotr迭代器迭代集合//通过集合返回迭代器对象,用于遍历当前集合Iterator it = list.iterator();//it.hasNext():判断集合是否有元素while(it.hasNext()){//next():获取集合中的一个元素Object o = it.next();System.out.println(o);}/*boolean b = it.hasNext();if(b){Object o = it.next();System.out.println(o);}b = it.hasNext();if(b){Object o = it.next();System.out.println(o);}*/ }
}

equals方法的使用:

public static void main(String[] args) {String str1="你好";String str2="你好";String str3 = new String("你好");//System.out.println(str1==str2);//System.out.println(str1==str3);//System.out.println(str1.equals(str3));Student s1=new Student("张三",21);Student s2=new Student("张三",20);System.out.println(s1==s2);System.out.println(s1.equals(s2));
}package com.test3;
​
public class Student {private String name;private int age;public Student(String name,int age){this.name=name;this.age=age;}
​public String getName() {return name;}
​public void setName(String name) {this.name = name;}
​public int getAge() {return age;}
​public void setAge(int age) {this.age = age;}​//重写equals方法,实现Student的内容比较@Overridepublic boolean equals(Object obj) {System.out.println("=========调用了equals==========");//先判断比较的目标对象是否是学生,如果不是学生则直接返回falseif(!(obj instanceof Student)){return false;}//说明目标对象是学生,通过向下转型(拆箱),获取学生对象Student stu = (Student)obj;//如果学生对象的名字和年龄都相等,则两个学生的内容相等if(this.name.equals(stu.getName()) && this.age==stu.getAge()){return true;}//如果有任何属性不相等,则返回falsereturn false;}
​@Overridepublic String toString() {return "Student [name=" + name + ", age=" + age + "]";}
}public static void main(String[] args) {List list = new ArrayList();list.add(100);list.add("aaa");list.add(1.234);Student s1=new Student("张三",20);list.add(s1);System.out.println(list);//list.remove(s1);Student s2=new Student("张三",20);//没有equals按地址比较,不能删掉,重写之后,按内容比较可以删掉list.remove(s2);System.out.println(list);}

2.3 LinkedList 实现类

  • 双链表实现了ListDeque接口
  • 优势:数据的插入和删除 效率高
  • 线程不同步
package com.test4;
​
import java.util.LinkedList;
import java.util.List;
​
public class Test1 {
​public static void main(String[] args) {//链表集合//List ll =new LinkedList();LinkedList ll =new LinkedList();ll.add("abc");ll.add(100);ll.add(1.234);//在链表头部插入数据ll.addFirst("张三");//在链表尾部插入数据ll.addLast("李四");System.out.println(ll.get(2));System.out.println(ll);}
}
​

2.4 Vector实现类

基本实现和ArrayList相同,实现了线程同步

2.5 Iterator 迭代器

Iterator常用方法:

第三节 Set接口及其实现类

3.1 Set接口

  • 不包含重复元素的集合
  • 无序的
  • 根据equals()方法判断是否相等,hashcode()判断

3.2 HashSet 实现类

  • 此类实现Set接口,由哈希表(实际为HashMap实例)支持
  • 线程不同步

Set避免对象重复的规则:

1.先判断hashCode值是否一样

2.在hashCode一样的前提下,再调用equals方法

package com.test5;
​
public class Student {private String name;private int age;public Student(String name,int age){this.name=name;this.age=age;}
​public String getName() {return name;}
​public void setName(String name) {this.name = name;}
​public int getAge() {return age;}
​public void setAge(int age) {this.age = age;}@Overridepublic int hashCode() {return this.name.hashCode()+this.age;//return 100;}
​//重写equals方法,实现Student的内容比较@Overridepublic boolean equals(Object obj) {System.out.println("=========调用了equals==========");//先判断比较的目标对象是否是学生,如果不是学生则直接返回falseif(!(obj instanceof Student)){return false;}//说明目标对象是学生,通过向下转型(拆箱),获取学生对象Student stu = (Student)obj;//如果学生对象的名字和年龄都相等,则两个学生的内容相等if(this.name.equals(stu.getName()) && this.age==stu.getAge()){return true;}//如果有任何属性不相等,则返回falsereturn false;}
​@Overridepublic String toString() {return "Student [name=" + name + ", age=" + age + "]";}
}
​public static void main(String[] args) {//Set:随机存储,不允许重复//Hash:哈希 散列Set set = new HashSet();set.add(100);set.add("abc");set.add(true);set.add(1.234);Student s=new Student("张三",20);set.add(s);//输出内容:数据随机分布System.out.println(set);//添加重复元素:不允许重复,重复的内容不会被添加set.add(100);set.add("abc");//又添加一个张三 20Student s2=new Student("张三",20);//Set避免对象重复的规则:1.先判断hashCode值是否一样 //                 2.在hashCode一样的前提下,再调用equals方法set.add(s2);System.out.println(set);}

第四节 Map接口及其实现类

4.1 Map接口

  • 存储:键值对:key-value
  • 键值不能重复,可以有一个null
package com.test6;
​
import java.util.HashMap;
import java.util.Iterator;
import java.util.Map;
import java.util.Set;
​
public class Test1 {
​public static void main(String[] args) {//创建Map集合对象Map map = new HashMap();Student s=new Student("张三",20);//以键值对的方式存储数据map.put(1, 100);map.put(2, "aaa");map.put(3, 1.234);map.put("a", 400);map.put("b", s);//输出mapSystem.out.println(map);//添加重复的键:后面键值会覆盖前面的键值//map.put(1,1000);//添加重复的值:键不允许重复,值允许重复//map.put(4, "aaa");//System.out.println(map);//删除 键值 a的记录//map.remove("a");//System.out.println(map);//判断是否包含 b这个键值对//System.out.println(map.containsKey("a"));//map中元素的个数//System.out.println(map.size());//单独获取map中的某个数据,根据键返回数据//System.out.println(map.get(2));//System.out.println(map.get("a"));//遍历map//第一种: for in 遍历/*//获取map中所有键的Set集合Set ks = map.keySet();//遍历键的集合,并通过键获取值for(Object k : ks){//单独返回键//System.out.println(k);//根据得到的键,获取对应的值System.out.println(k+"  -->   "+map.get(k) );}for(Object k : map.keySet()){//单独返回键//System.out.println(k);//根据得到的键,获取对应的值System.out.println(k+"  -->   "+map.get(k) );}*///第二种:Iterator迭代//Set set = map.keySet();Iterator it =map.keySet().iterator();while(it.hasNext()){//获取键Object k = it.next();System.out.println(k+" ---> "+map.get(k));}}
​
}
​

第五节 泛型

为什么实用泛型:

在往集合中存储数据的时候缺乏类型检查,不安全

泛型:类型检查机制;

好处:省略了装箱和拆箱,效率高;类型安全。

List<E>:E类型约束
Map<K,V>:K,V类型约束package com.test7;
​
import java.util.ArrayList;
import java.util.List;
​
public class Test1 {
​public static void main(String[] args) {//非泛型List集合//1.可以存储各种类型的数据//2.获取数据的时候,直接获取的是Object数据,需要判断之后,转型才能使用数据的特定方法/*List list = new ArrayList();list.add(100);list.add("abc");list.add(new Car("宝马",200));for(int i=0;i<list.size();i++){//2.获取数据的时候,直接获取的是Object数据,需要判断之后,转型才能使用数据的特定方法Object o = list.get(i);if(o instanceof Car){Car c = (Car)o;System.out.println(c.getBrand()+" "+c.getPrice());}else{System.out.println(o);}}*///泛型集合//1.泛型集合只能存储特定类型的数据  //2.获取数据的之后,可以直接得到特定类型的数据,不需要转型List<Car> list = new ArrayList<Car>();list.add(new Car("宝马",200));list.add(new Car("奔驰",250));list.add(new Car("法拉利",300));for(int i=0;i<list.size();i++){Car c = list.get(i);System.out.println(c.getBrand()+" "+c.getPrice());}}
​
}package com.test10;
​
import java.util.ArrayList;
import java.util.List;
import java.util.Scanner;
​
public class Test {
​public static void main(String[] args) {//定义商品存储结构List<Goods> goodsList =new ArrayList<Goods>();goodsList.add(new Goods("酸奶",2.5,"食品"));goodsList.add(new Goods("面包",5.5,"食品"));goodsList.add(new Goods("奶茶",5.5,"饮品"));//综合练习:商品的添加,删除,查询Scanner sc=new Scanner(System.in);System.out.println("===========欢迎使用XXX超市管理系统=================");while(true){System.out.println("请选择:1.查询商品  2.添加商品  3.删除商品 4.退出");int choose = sc.nextInt();if(choose==1){System.out.println("你选择了查询商品");//遍历商品System.out.println("编号t名称t价格t分类");for(int i=0;i<goodsList.size();i++){Goods g=goodsList.get(i);System.out.println((i+1)+"t"+g.getName()+"t"+g.getPrice()+"t"+g.getCategory());}//for(Goods g: goodsList){//  System.out.println(g.getName()+"t"+g.getPrice()+"t"+g.getCategory());//}}else if(choose==2){System.out.println("你选择了添加商品");//让用户输入名称,输入价格,输入分类System.out.println("请输入商品名称:");String gname = sc.next();System.out.println("请输入商品价格:");double gprice = sc.nextDouble();System.out.println("请输入商品分类:");String gcate = sc.next();//构建商品对象Goods mygoods = new Goods(gname,gprice,gcate);//将商品对象添加到list中goodsList.add(mygoods);}else if(choose==3){System.out.println("你选择了删除商品");//1.让用户选择要删除的商品编号 3.删除System.out.println("请输入要删除的商品编号:");int delNo = sc.nextInt();//从List中删除指定编号位置(编号-1)的商品goodsList.remove(delNo-1);}else if(choose==4){System.out.println("退出系统");break;}else{System.out.println("选择错误,请重新选择");}}System.out.println("======欢迎下次使用========");}
​
}
​

作业

构建一个学生集合,定义方法实现添加、修改、删除、查找、遍历等功能;

判断两个list集合里的对象某个属性值是否一样_第七章 集合框架相关推荐

  1. 如何将一个集合里的对象进行计算再排序

    如何将一个集合里的对象进行计算再排序 1.原来获取到的数据格式(数据格式示例) [{"id": 1, "userName": "像我这样的人" ...

  2. java同名变量在list中添加两次_去除集合中自定义对象的重复值(对象的成员变量值都相同)...

    package cn.itcast_04; import java.util.ArrayList; import java.util.Iterator; /* * 需求:去除集合中自定义对象的重复值( ...

  3. List集合中的对象根据属性排序

    List集合中的对象根据属性排序 集合类List存放的数据,默认是按照放入时的顺序存放的,比如依次放入A.B.C,则取得时候,则也是A.B.C的顺序,实际场景中,有时我们需要根据自定义的规则对List ...

  4. 判断对象中属性值是否全为空

    import java.lang.reflect.Field; /*** 判断对象中属性值是否全为空** @param object* @return*/public static boolean c ...

  5. 将对象的属性值复制到另一个对象中

    将对象的属性值复制到另一个对象中 /**** 将第一个对象的属性值复制到第二个对象中* @param <T> 第一个对象* @param <R> 第二个对象*/ class H ...

  6. 如何获取数组中嵌套对象中属性值不为空的对象?

    如何获取数组中嵌套对象中属性值不为空的对象? 有一个对象数组如下: let arr = [ {id:1,aa:'aa1'}, {id:2,aa:'aa2',bb:{ cc:{dd:12} }}, {i ...

  7. JavaSE 第七章集合 Collection

    第七章集合Collection 7.1 Iterable 接口 首先是集合Collection的的爸爸,列表List的爷爷 Iterable接口. 实现此接口的类队形可以成为for-each循环的目标 ...

  8. Java 用反射设置对象的属性值

    为什么80%的码农都做不了架构师?>>>    /*** 用反射设置对象的属性值* @param obj 需要設置值的對象* @param fieldName 需要設置值的屬性* @ ...

  9. Java验证对象的属性值是否都为空

    package com.hzrc.apply.utils;import com.hzrc.entity.user.ApplyTemplate;import java.lang.reflect.Fiel ...

最新文章

  1. 中科院aibench_中科院发布目标追踪数据集,万条视频,150万个边界框 | 快来下载...
  2. liunx配置本地yum源和更新aliyun yum源
  3. Centos7修改默认网卡名(改为eth0)以及网卡启动报错RTNETLINK answers: File exists处理...
  4. 前端 圆形进度图_CSS3+JS实现静态圆形进度条
  5. P5659-[CSP-S2019]树上的数【贪心】
  6. hdu 2110 基础母函数
  7. php aws ses,python-在AWS SES上接收和解析电子邮件
  8. 如何用python做一个时钟_Python使用turtle库制作一个时钟
  9. PHP线程安全和非线程安全有什么区别
  10. RecycleView的普通适配器(另加RecycleView的格局格式)
  11. 【三维路径规划】基于matlab改进粒子滤波无人机三维路径规划【含Matlab源码 1269期】
  12. Ubuntu20.04安装增强功能
  13. 真机调试报错 Could not locat device support files
  14. 电脑磁盘(特别是C盘)又满了,不知道删除什么?试试这款磁盘分析工具
  15. Word文档 替换功能
  16. GFP_ATOMIC or GFP_KERNEL 区别
  17. 类脑计算将何去何从?
  18. 阿里云成为全球唯一完成德国C5云安全基础附加标准审计云服务商 数据安全获“最严谨”标准认可...
  19. wacom linux 驱动下载,Drivers
  20. UESTC数据结构专题训练 G,H,I,J

热门文章

  1. 一些在NLP的面试中提问频率非常高的问题
  2. 网易云信上线合作伙伴计划,亿元订单等你强强联合!
  3. SpringCloud微服务实战(四)-微服务中的服务拆分
  4. Objective-C 中Socket常用转换机制(NSData,NSString,int,Uint8,Uint16,Uint32,byte[])
  5. Codeforces 919D - Substring
  6. VMware Identity Manager 与CAS, Keycloak的集成
  7. Gym-100676E Time Limit Exceeded?
  8. 微服务软件架构的认识和设计模式
  9. bzoj1202[HNOI2005]狡猾的商人
  10. 如何画出漂亮的气象(实时流量)图