一、java集合概述
二、集合框架
JAVA集合具体可分为两种体系:1.Collection接口(集合) 2. Map接口 ( 映射 )
|----Collection接口:单列集合,用来存储一个一个的对象 * |----List子接口:存储有序的、可重复的数据。 -->“动态”数组,长度是可变的 * |--实现类--ArrayList、LinkedList、Vector * * |----Set子接口:存储无序的、不可重复的数据 -->类似于高中讲的“集合” * |--实现类--HashSet、LinkedHashSet、TreeSet * |----Map接口:双列集合,用来存储一对(key - value)一对的数据 -->高中函数:y = f(x) * |--实现类--HashMap、LinkedHashMap、TreeMap、Hashtable、Properties
- key-value的映射关系和函数一样,一个key只能对应一个value,但是一个value可以对应不同key。
三、Collection接口中的11个方法(常用):
//Collection接口的实现类ArrayList
Collection c = new ArrayList();//接口的引用指向实现类的对象
//void add(Object obj);向集合中添加对象
c.add("AA");
c.add(123);//自动装箱,变为Integer类型
c.add("BB");
c.add("AA");//可以重复
c.add(new Date());//与数组的区别:可以装不同类型的对象
//int size():获取长度
System.out.println(c.size());//5
Collection c1 = new ArrayList();
c1.add("AAAAA");
c1.add("BBBBB");
//void addAll(Collection c):将一个集合中的所有对象添加到另一集合
c.addAll(c1);
//void size():返回集合中元素的个数(注意:在数组中,长度和元素个数不一定相等,集合中肯定相等)
System.out.println(c.size());//7
- 这里只是拿Collection的list子接口的实现类之一:ArrayList 来演示这11中方法
- 也就是说:list接口的父接口Collection的引用也能指向list接口的实现类ArrayList,因为ArrayList实现了list接口,就代表着重写了list接口中的所有抽象方法(包括其继承的接口Collection中的方法),因此ArrayList也是Collection的实现类。
- ArrayList中存储的是有序的、可重复的集合元素
//void clear():清空集合中元素
c1.clear();
System.out.println(c1.size());//0
//boolean contains(Object obj)
System.out.println(c.contains("AA"));//true
person10 p1 = new person10("tom", 10);
person10 p2 = new person10("tom", 10);
c.add(p1);
System.out.println(c.contains(p2));//true
//boolean containsAll(Collection coll1):判断集合1中的元素是不是都在当前集合中
//boolean remove(Object obj):移除对象obj
System.out.println(c);//[AA, 123, BB, AA, Fri Dec 18 09:56:57 CST 2020, AAAAA, BBBBB, day04.person10@677327b6]
c.remove("AA");
c.remove(p2);
System.out.println(c);//[123, BB, AA, Fri Dec 18 09:56:21 CST 2020, AAAAA, BBBBB]
//boolean removeAll(Collection coll):删除集合coll与当前集合交集的部分,也就是说coll不一定是当前集合的子集
Collection c2 = Arrays.asList(123, "BB",p1,123456);//直接向集合c中添加多个元素
c.removeAll(c2);
System.out.println(c);//[AA, Fri Dec 18 10:01:42 CST 2020, AAAAA, BBBBB]
- 数组和集合的区别:数组在一开始声明时就已经确定好长度了,但是如果不赋值,那么该位置就为null。集合可以动态添加元素,长度不受限制
- contains(Object obj):其实该方法内部调用了传入的对象的equals()方法(Object类中的方法)—obj.equals(........),将obj和集合中的对象一个一个进行比较判断是否相等——obj.equals(集合中的每一个对象)
- person类是自定义类,如下图,其中重写了其Object父类中的equals方法,使equals从原先的比较地址值变为比较内容
-
因此:System.out.println(c.contains(p2));//true ,如果不重写的话就是false(比较地址)
class person10 {
private String name;
private int age;
person10(String name, int age) {
this.name = name;
this.age = age;
}
@Override
public boolean equals(Object o) {
if (this == o) return true;
if (o == null || getClass() != o.getClass()) return false;
person10 person10 = (person10) o;
return age == person10.age &&
Objects.equals(name, person10.name);
}
}
- remove(Object obj)方法也调用的obj.equals(),与上述一样,只要和参数里传入的内容相同的对象,就会被移除
- 方法⑦:boolean retainAll(Collection coll):把当前集合修改为——当前集合与coll的交集,并且如果交集不为空则返回true,否则false。并且对coll集合不会有影响
- 方法⑧:boolean equals(Collection):判断集合是否相等,如果是ArrayList实现的接口,会按顺序比较,顺序不同也会认为是false
- 方法⑨:Object[] toArray():变成对象数组