一、集合的概念
1.什么是集合
集合是一种容器,长度可变, 可以存储任意类型的对象.
基本数据类型也可以装入集合, 但其实内部是先自动装箱成包装类对象,然后再存入集合的(可以存放任意引用类型的数据,而不能存放基本数据类型,如果即使放了基本数据类型,也自动进行了装箱)
集合中也有一个数组(每次看是否用完然后以1.5的速度增长(小数舍弃))
2.数组和集合的异同:
1.即可以存储基本数据类型,也可以存放引用数据类型
集合只可以存放任意引用类型的数据,而不能存放基本数据类型,如果即使放了基本数据类型,也自动进行了装箱
2数组的长度是不可以改变的
集合的长度是可变的,会随着元素的增加而增加。
不变用数组,可变的用集合
1、使用:Collection coll = new ArrayList();
coll.add("a");
coll.add(123);
coll.add(true);
coll.clear(); //clear()方法清空集合中的所有对象
boolean b = coll.contains("z"); //contains()方法判断集合中是否包含z
coll1.equals(coll); //equals 方法比较两个集合对象,同String中的equals,对象中如果字 符序列相同则返回true;里面的是有顺序的,如下中是正确的,但如果换顺序就报错。
(1)Collection coll = new ArrayList(); (2) Collection coll 1= new ArrayList();
coll.add("a"); coll1.add("a");
coll.add("b"); coll1.add("b");
coll.add("c"); coll1.add("c");
coll.isEmpty(); //isEmpty()方法判断集合是否为空
coll.remove("c");//remove()删除传入的元素,删除成功返回true,否则为false
coll.size(); //size()获取集合长度
coll.addAll(coll1);//addAll()把一个集合中的全部元素添加的另一个集合中结果
//[a,b,c,a,b,c]如果用coll.add(coll1);就是把coll1看做
//一个对象结果[a,b,c,[a,b,c]]
coll.containsAll(coll1);//判断coll1是不是coll的子集
coll.removeAll(coll1);//删除coll和coll1的交集,返回true
coll.retainAll(coll1);//取交集保留下来传给coll,返回值看coll的结果有没有改变,
//不改变为 false改变为true
Collection是集合类的上级接口,继承与他的接口主要有Set和List.
Collections是针对集合类的一个帮助类,他提供一系列静态方法实现对各种集合的搜索、排序、线程安全化等操作。
二、迭代器迭代:
2、使用List list = new ArrayList();
list.add("a");
list.add("b");
list.add("c");
list.add(3,"z");// 在索引3出添加z
for(inti=0;i<list.size();i++) //list集合中的一种迭代方式(遍历)(迭代第一种)
{
System.out.println(list.get(i));
}
intindex=list.indexof("a");// 第一个a的索引
intindex=list.lastIndexof("a");//最后一个a的索引
Object obj =list.remove(0); //通过索引删除元素
boolean b=list.remove("a"); //通过对象删除元素
此处要注意:list.add(123); 如果删除list.remove(123);则报出角标越界异常,因为不会自动装箱。//此处应该手动装箱 list.remove(new Integer(123));
list.set(0,"aaa");//修改指定位置的元素,指定位置要在0—长度减1的之间
list.subList(1,4);//有返回值,应该建一个List引用对象来存放。
//只要是能用迭代器迭代的都可以用增强for循环
iterator it = list.iterator(); // 获取迭代引用 //迭代方式一(迭代第二种)
while(it.hasNext()){ //判断集合是否有元素
Sysotem.out.println(it.next());//获取集合元素
}
for (Iterator it2= list.iterator() ; it2.hasNext(); ){ //迭代第二种方式,节约一点内存
System.out.println(it2.next());
}
// 迭代的功能为什么抽取到一个接口中?
因为整个集合框架体系结构,每一个类存储的结构(数据结构)都是不一样的,存的不一样,就导致取得也不一样,所以没办法定义一套方法,来获取所有的集合类中的存储对象,那么就抽取抽象的方法,由具体的子类去实现即可。
3、迭代:ArrayList方法
ArrayList list =new ArrayList();
//增强for循环foreach 迭代第三种
1.5新特性;
for(临时变量:容器名){ //临时变量的数据类型和集合中存储的元素的数据类
//型一致 (他的底层就是使用迭代器)
System.out.println(临时变量);
}
for(Object obj : list){ //添加的字符串自动提升为Object
System.out.println(obj);
}
三、三种迭代方式中的删除问题
1、普通for循环
for (int i=0;i<list.size();i++){
Object obj = list.get(i);
if(obj.equals("a")){
list.remove(i - -); //因为i会加1索引会减1,中间有个值会被跳过去,所以
//用后- -运算
}
}
2、迭代器的删除
Iteratorit=list.iterator()
while(it.hasNext()){
Object obj =it.next();
if(obj.equals("b")){
list.remove("b"); // 并发修改异常即迭代器在迭代时,不能用集合删除
//方法 此处应该用迭代自己的it.remove();//不能传参
}
}
3、增强for循环删除
for(Object obj : list){
if(obj.equals("b")){
list.remove(obj); //也会出现并发修改异常,不能用来删除。
}
}