当需要在Java程序中记录多个类型不同的对象数据时,则准备⼀个集合。 集合中只能放对象,基本数据类型有自动装箱功能
集合的框架结构
- Java中集合框架顶层框架是:java.util.Collection集合 和java.util.Map集合。
- 其中Collection集合中存取元素的基本单位是:单个元素。
- 其中Map集合中存取元素的基本单位是:单对元素。
java.util.Collection接⼝是List接⼝、Queue接⼝
以及Set接⼝的⽗接⼝,因此该接⼝⾥定义的⽅法
既可⽤于操作List集合,也可⽤于操作Queue集合
和Set集合。
常用的方法:
boolean add(E e)//向集合中添加对象,添加成功是true,失败时false
Collection collection = new ArrayList();//Collection是接口,不能实例化,所以使用子类实例化
collection.add(12);//自动装箱
collection.add("sdfs");//常量池
collection.add(new StudentTest("张三",18));
System.out.println(collection);
//使用集合中元素来调用对应的toString方法,[12, sdfs, StudentTest{name='张三', age=18}]
boolean addAll(Collection c)//将c集合中的元素一个个放到存在的集合中
boolean add(E c)//将c看作一个对象放到存在的集合中
Collection collection = new ArrayList();
//只能放对象
collection.add(1);//自动装箱池
collection.add(1.2);
collection.add("hahaha");//常量池
System.out.println(collection);
Collection collection1 = new ArrayList();
collection1.add(100);
collection1.add(new Student("张三",18));
collection.addAll(collection1);//[1, 1.2, hahaha, 100, Student{name='张三', age=18}]
System.out.println(collection);
collection.add(collection1);
System.out.println(collection);//[1, 1.2, hahaha, [100, Student{name='张三', age=18}]]
Collection collection2 = new ArrayList();
collection2.add(2);
collection2.add("two");
collection.add(collection2);
System.out.println(collection);//[1, 1.2, hahaha, 100, Student{name='张三', age=18}, [2, two]]
boolean contains(Object o)//判断是否包含指定对象
boolean flag = collection.contains(1.2);
System.out.println(flag);//true
//contains底层调用equals方法,调用参数对象的equals方法
//由于Student的equals方法没有重写,所以调用从Object中继承的版本,比较地址
//这两个Student内容虽然相同,但是地址并不相同
// 若要比较内容需要在Student中重写equals方法
flag = collection.contains(new Student("张三",18));//未重写equals方法前,false
System.out.println(flag);
System.out.println(flag);//重写后比较内容,true
boolean containsAll(Collection<?> c);//判断是否包含参数指定的所有对象
Collection collection3 = new ArrayList();
collection3.add(1);//[1]
flag = collection.containsAll(collection3);
System.out.println(flag);//true
//只要collection中包含collection3中所有的元素,就返回true,还是调用equals方法
collection3.add(8);//[1,8]
flag = collection.containsAll(collection3);
System.out.println(flag);//false
-----------------------------------------------------------
System.out.println("collection:"+collection);//collection:[1, 1.2, hahaha, 100, Student{name='张三', age=18}, 2, two]
System.out.println("collection2:"+collection2);//collection2:[2, two]
flag = collection.contains(collection2);//collection是否包含[2,two]这个对象,false
System.out.println(flag);
flag = collection.containsAll(collection2);//collection是否包含2,two,true
System.out.println(flag);
boolean retainAll(Collection<?> c);//保留当前集合中存在且参数集合中存在的所有对象,就是求两个集合的交集然后覆盖集合中原有的内容
注:当调用方法的集合发生改变时返回true,未发生改变返回false
System.out.println(collection2);//[2,two]
System.out.println(collection3);//[1,8]
//一个集合包含本身,所以未发生改变,返回false
flag = collection2.retainAll(collection2);
System.out.println(collection2);//[2,two]
System.out.println(flag);//false
//这两个集合没有交集,所以collection2变为空集,发生了改变,返回true
flag = collection2.retainAll(collection3);
System.out.println(collection2);//[]
System.out.println(flag);//true
boolean remove(Object o);//从集合中删除对象,调用方法的对象发生改变则返回true,未发生改变返回false
boolean removeAll(Collection<?> c)//从集合中删除指定集合中的所有对象
System.out.println(collection);//[1, 1.2, hahaha, 100, Student{name='张三', age=18}, 2, two]
System.out.println(collection2);//[2, two]
//调用equals比较内容是否相同,注意equals是否重写
flag = collection.remove(new Student("张三",18));
System.out.println(flag);//对比内容删除
//调用方法的集合发生改变则返回true
//未发生改变,返回false
flag = collection.remove(collection2);
System.out.println(flag);//false
flag = collection.removeAll(collection2);//删除2,two
void clear();//清空集合
int size();//返回集合中元素个数
boolean isEmpty();//判断是否为空
System.out.println(collection.isEmpty());//不为空,false
collection.clear();
System.out.println(collection);//[]
System.out.println(collection.isEmpty());//为空,true
boolean equals(Object o);//判断是否相等
Collection collection4 = new ArrayList();
collection4.add(2);
collection4.add("two");//[2,two]
System.out.println(collection2.equals(collection4));//相同返回true
Object[] toArray();//将集合转换为数组
Object[] objects = collection.toArray();
for(Object e:objects){
System.out.print(e + " ");
}//1 1.2 hahaha 100 Student{name='张三', age=18} 2 two
Iterator接口(重点)
java.util.Iterator接⼝主要⽤于描述迭代器对象,可以遍历Collection集合中的所有元素。
java.util.Collection接⼝继承Iterator接⼝,因此所有实现Collection接⼝的实现类都可以使⽤该迭代器对象。
boolean hasNext();//判断集合中是否有可以访问的元素(如果next()返回一个元素而不是抛出异常,则返回true)
Iterator iterator2 = collection2.iterator();//创建collection2的迭代器
System.out.println(iterator2.hasNext());//collection开始不为空,返回true
collection2.clear();//清空collection2
System.out.println(iterator2.hasNext());//collection2为空,返回false
E next();//取出一个元素并指向下一个元素
void remove();//删除访问到的最后一个元素
//通过迭代器打印元素
Iterator iterator = collection.iterator();
while(iterator.hasNext()){
//取出元素并指向下一个元素
//System.out.print(iterator.next() + " ");
Object b = iterator.next();
System.out.print(b + " ");
}//1 1.2 hahaha 100 Student{name='张三', age=18} 2 two
-------------------------------------------------------------
//上面的iterator已经指向最后一个元素的末尾,所以需要重新赋值
iterator = collection.iterator();
while(iterator.hasNext()){
Object obj = iterator.next();
if(obj.equals(1.2)){
iterator.remove();//删除1.2
}
}//[1, hahaha, 100, Student{name='张三', age=18}, 2, two]
for each遍历
for (元素类型 变量名 : 数组/集合名称) {
循环体:
}
int[] arry = {2,1,4,2,7,5,8};
for(int e: a){
System.out.print(e + " ");
}//2 1 4 2 7 5 8