概述
- 当需要在Java程序中记录单个数据内容时,则声明一个变量。
- 当需要在Java程序中记录多个类型相同的数据内容时,声明一个一维数组。
- 当需要在Java程序中记录多个类型不同的数据内容时,则创建一个对象。
- 当需要在Java程序中记录多个类型相同的对象数据时,创建一个对象数组。
- 当需要在Java程序中记录多个类型不同的对象数据时,则准备一个集合
框架结构
- Java中集合框架顶层框架是:java.util.Collection集合 和 java.util.Map集合
- Collection集合中存取元素的基本单位是:单个元素。
- Map集合中存取元素的基本单位是:单对元素
插入ArrayList()的知识
ArrayList 是一个数组队列,相当于是一个动态数组,它的容量能动态增长,但ArrayList中的操作不是线程安全的,在单线程中才使用ArrayList
Collection集合
java.util.Collection接口是List接口、Queue 接口以及Set接口的父接口,因此该接口里定义的方法既可用于操作List集合,也可用于操作Queue集合和Set集合
同时:接口是不能用来new对象的。即Collection c1 = new Collection()是不行的
public class CollectionTest {
public static void main(String[] args) {
//1.准备一个Collection集合并打印
//接口类型的引用指向了实现类的对象,形成多态
Collection c1 = new ArrayList();
//自动调用ArrayList()类中的toString方法 默认打印格式为:[元素值1, 元素值2,...]
System.out.println("集合中的元素有:"+c1);//啥也没有[]
System.out.println("-----------------------");
//2.向集合中添加单个元素并打印
boolean b1 = c1.add(new String("one"));
System.out.println("b1="+b1);//true
System.out.println("集合中的元素有:"+c1);
b1 = c1.add(Integer.valueOf(2));
System.out.println("b1="+b1);//true
System.out.println("集合中的元素有:"+c1);//[one,2]
b1 = c1.add(new Person("张飞",30));
System.out.println("b1="+b1);//true
System.out.println("集合中的元素有"+c1);//[one,2,]
//3.向集合中添加多个元素并打印
}
}
}
}
Person类内容如下
结果如下:
c1集合中最后一个元素就是Person类中的toString()方法
打印集合中的所有元素时,本质上就是打印集合中的每个对象,也就是让每个对象调用对应类的toString()方法
String()类和Integer()类中也有toString()方法的(Java官方重写过)
添加多个元素
//3.向集合中添加多个元素并打印
Collection c2 = new ArrayList();
c2.add("three");
c2.add(4);//自动装箱机制
System.out.println("c2="+c2);//[three,4]
//将c2中的所有元素全部添加到c1中
b1=c1.addAll(c2);
System.out.println("b1="+b1);
System.out.println("c1="+c1);//[one, 2, Person{name='张飞', age=30},three,4]
addAll就是将集合c2中的元素一个个一次添加到集合c1中
笔试考点
//笔试考点
b1=c1.add(c2);
System.out.println("b1="+b1);
System.out.println("c1="+c1);
结果
把c2当作一个整体放进去,有中括号
Collection集合判断单个元素是否存在
注意这里contain的参数是Object类型的,意味着形参可以传任意形式的对象
//判断集合中是否包含参数指定的单个元素
b1=c1.contains(new String("one"));
System.out.println("b1="+b1);//true
b1=c1.contains(new String("two"));
System.out.println("b1="+b1);//false
b1=c1.contains(Integer.valueOf(2));
System.out.println("b1="+b1);//true
b1=c1.contains(new Person("张飞",30));
System.out.println("b1="+b1);//false
对于最后一段代码,明明c1集合中内容为[one, 2, Person{name=‘张飞’, age=30}, three, 4, [three, 4]],有对应元素,但b1=c1.contains(new Person("张飞",30));
为false,是因为:
此处先插入 == 和 equals 的区别
- 使用
==
进行比较的时候,比较的是他们在内存中的存放地址,所以只有同一个new出来的对象,他们的比较后的结果才会为true - Java中所有的类都是继承于Object,在Object中定义了一个equals的方法,这个方法的初始行为是比较对象的内存地址
- 但在一些类库如String,Integer,Date在这些类当中这个方法被覆盖掉了,equals被重写了,不再是比较类在堆内存中的存放地址了。(如仅会比较内容,而不是地址)
- 在没有覆写equals方法的情况下,他们之间的比较还是基于他们在内存中的存放位置的地址值
插入结果,承接上文
- contains方法的工作原理是:Objects.equals(o,e),其中o代表contains方法的形式参数,e代表集合中的每个元素
- 也就是说contains 拿着参数对象与集合中已有的元素依次进行比较,比较的方式调用Objects.equals
- 而Person类中没有重写equals方法,则调用从Object类中继承下来的equals方法,比较两个对象的地址,所以为false
- 在Person()中重写equals方法可解决这个问题
Collection判断所有元素是否存在
System.out.println("-----------------------");
System.out.println("c1="+c1);
//判断当前集合中是否包含参数指定集合的所有元素
Collection c3 = new ArrayList();
c3.add(4);
System.out.println("c3="+c3);//[4]
//判断c1中是否包含c3中所有元素
b1=c1.containsAll(c3);
System.out.println("b1="+b1);//true
c3.add("five");
System.out.println("c3="+c3);//[4,five]
b1=c1.containsAll(c3);
System.out.println("b1="+b1);//false
结果如下
Collection中containsAll的笔试考点
//笔试考点
System.out.println("c1="+c1);
System.out.println("c2="+c2);
b1 = c1.containsAll(c2);//true
System.out.println("b1="+b1);
//判断集合c1中是否有集合c2这个整体为单位的元素
b1 = c1.contains(c2);
System.out.println("b1="+b1);
注意!
addAll是把元素一个个加进去,如果addAll了一个a集合,就不会再有以a集合整体为元素的值的,会返回false,上面是因为c1里有个
Collection集合实现交集的计算
这个方法的返回值取决于当前集合是否发生改变,如果此集合因此发生改变就返回true
System.out.println("-----------------------");
//计算两个集合的交集并保留到当前集合中
System.out.println("c2="+c2);//[three, 4]
System.out.println("c3="+c3);//[4, five]
b1 = c2.retainAll(c2);//当前集合中元素没有发生改变
System.out.println("b1="+b1);
System.out.println("c2="+c2);
//计算集合c2和c3的交集并保留到c2中,取代集合c2中原有数值
b1 = c2.retainAll(c3);
System.out.println("b1="+b1);
System.out.println("c2="+c2);
System.out.println("c3="+c3);
返回值只看当前集合中元素是否有发生改变
Collection集合实现元素的删除
//实现集合中单个元素和所有元素得删除操作
System.out.println("c1="+c1);
//删除参数指定的单个元素
b1 = c1.remove(1);
System.out.println("b1="+b1);//false
b1 = c1.remove("one");
System.out.println("b1="+b1);//true
System.out.println("c1="+c1);
remove方法工作原理也是 Object.equals(o,e)
实现集合中所有元素的删除操作
//实现集合中所有元素的删除操作
System.out.println("c3="+c3);//[4, five]
System.out.println("c1="+c1);//[4, five]
//从集合c1中删除c3中的所有元素
b1 = c1.removeAll(c3);
System.out.println("b1="+b1);//c1改变了就true true
System.out.println("c1="+c1);
System.out.println("c3="+c3);
本质上是一个一个元素进行删除,有元素则删除,没有则不删除
Collection集合中其他方法的测试
//实现集合中其他方法的测试
System.out.println("c1="+c1);
System.out.println("集合中元素的个数为:"+c1.size());
System.out.println(0 ==c1.size() ? "集合已经空了" : "集合还没有空");//没有空
System.out.println(c1.isEmpty() ? "集合已经空了": "集合还没有空");//没有空
//清空集合中的所有元素
c1.clear();
System.out.println("c1="+c1);
System.out.println("集合中元素的个数为:"+c1.size());
System.out.println(0 ==c1.size() ? "集合已经空了" : "集合还没有空");//已经空了
System.out.println(c1.isEmpty() ? "集合已经空了": "集合还没有空");//已经空了
Collection集合和数组的转换
//实现集合和数组类型之间的转换
Collection c5 = new ArrayList();
c5.add(1);
c5.add(2);
c5.add(3);
//集合向数组的转换
Object[] objects = c5.toArray();
//打印数组中所有元素
System.out.println("数组中的元素有:"+ Arrays.toString(objects));
//数组类型向集合类型的转换
Collection object1 = Arrays.asList(objects);
System.out.println("集合中的元素有:"+object1);
通常认为:集合是用于取代数组的结构