Collection
|-List:元素是有序的,元素可以重复,因为该集合体系有Index(索引)
|-Set:元素是无序的,元素不可以重复
List:
特有方法:凡是可以操作角标 的方法都是该体系特有的方法。
增
add(index,element);
addAll(index,Collection);
删
remove(index);
改
set(index,element);
查
get(index);
subList(from,to);//获取子列表
ListIterator();
代码实现:
import java.util.*; class ListDemo{ public static void sop(Object obj){ System.out.println(obj); } public static void main(String[] args){ ArrayList al = new ArrayList(); //添加元素 al.add("java1"); al.add("java2"); al.add("java3"); al.add("java4"); sop("原集合是:"+al); //在指定位置添加元素 al.add(1,"java9");//相当于插入操作 //删除指定位置的元素 //al.remove(2); //修改元素 al.set(2,"java007"); //通过角标获取元素 sop("get(1):"+al.get(1)); sop(al); //获取所有元素 for(int x=0;x<al.size();x++) sop("al("+x+")="+al.get(x)); Iterator it = al.iterator(); while(it.hasNext()) sop("next="+it.next()); //通过indexOf获取对象的位置 sop("index="+al.indexOf("java2")); //获取子列表 List sub = al.subList(1,3);//包含1不包含3 sop("sub="+sub); } }
---------------------------------------------
重点:列表迭代器
先从Collection中的迭代器开始说起,接上代码:
import java.util.*; class ListDemo{ public static void sop(Object obj){ System.out.println(obj); } public static void main(String[] args){ //演示列表迭代器 ArrayList al = new ArrayList(); //添加元素 al.add("java1"); al.add("java2"); al.add("java3"); al.add("java4"); //在迭代过程中,准备添加或者删除元素 Iterator it = al.iterator(); while(it.hasNext()){ Object obj = it.next(); if(obj.equals("java2")) al.add("java008"); sop("obj="+obj); } } public static void method_1(){ ArrayList al = new ArrayList(); //添加元素 al.add("java1"); al.add("java2"); al.add("java3"); al.add("java4"); sop("原集合是:"+al); //在指定位置添加元素 al.add(1,"java9");//相当于插入操作 //删除指定位置的元素 //al.remove(2); //修改元素 al.set(2,"java007"); //通过角标获取元素 sop("get(1):"+al.get(1)); sop(al); //获取所有元素 for(int x=0;x<al.size();x++) sop("al("+x+")="+al.get(x)); Iterator it = al.iterator(); while(it.hasNext()) sop("next="+it.next()); //通过indexOf获取对象的位置 sop("index="+al.indexOf("java2")); //获取子列表 List sub = al.subList(1,3);//包含1不包含3 sop("sub="+sub); } }
结果:
报错了,这种异常叫并发修改异常,原因在于在迭代的过程中,用集合的操作。所以修改成迭代器的操作就可以了,例如修改成下列代码,可是问题又来了,Iterator迭代器有局限性,它只有判断(hasNext()),取出(next())和移除(remove())操作,并没有添加这个操作。
import java.util.*; class ListDemo{ public static void sop(Object obj){ System.out.println(obj); } public static void main(String[] args){ //演示列表迭代器 ArrayList al = new ArrayList(); //添加元素 al.add("java1"); al.add("java2"); al.add("java3"); al.add("java4"); //在迭代过程中,准备添加或者删除元素 Iterator it = al.iterator(); while(it.hasNext()){ Object obj = it.next(); if(obj.equals("java2")) it.remove();//将java2的引用从集合中删除了 sop("obj="+obj); } sop(al); } public static void method_1(){ ArrayList al = new ArrayList(); //添加元素 al.add("java1"); al.add("java2"); al.add("java3"); al.add("java4"); sop("原集合是:"+al); //在指定位置添加元素 al.add(1,"java9");//相当于插入操作 //删除指定位置的元素 //al.remove(2); //修改元素 al.set(2,"java007"); //通过角标获取元素 sop("get(1):"+al.get(1)); sop(al); //获取所有元素 for(int x=0;x<al.size();x++) sop("al("+x+")="+al.get(x)); Iterator it = al.iterator(); while(it.hasNext()) sop("next="+it.next()); //通过indexOf获取对象的位置 sop("index="+al.indexOf("java2")); //获取子列表 List sub = al.subList(1,3);//包含1不包含3 sop("sub="+sub); } }
所以为了解决这个局限性的问题,List集合特有的迭代器,ListIterator是Iterator的子接口
在迭代时,不可以通过集合对象的方法操作集合中的元素,因为会发生并发修改异常(ConcurrentModificationException)
如果想要其他的操作:如添加,修改等,就需要使用Iterator的子接口:ListIterator
该接口只能通过List集合的ListIterator方法获取。
演示代码如下:
import java.util.*; class ListDemo{ public static void sop(Object obj){ System.out.println(obj); } public static void main(String[] args){ //演示列表迭代器 ArrayList al = new ArrayList(); //添加元素 al.add("java1"); al.add("java2"); al.add("java3"); al.add("java4"); sop(al); ListIterator li = al.listIterator(); while(li.hasNext()){ Object obj = li.next(); if(obj.equals("java2")) li.add("java009"); } sop(al); /* //在迭代过程中,准备添加或者删除元素 Iterator it = al.iterator(); while(it.hasNext()){ Object obj = it.next(); if(obj.equals("java2")) it.remove();//将java2的引用从集合中删除了 sop("obj="+obj); } sop(al); */ } public static void method_1(){ ArrayList al = new ArrayList(); //添加元素 al.add("java1"); al.add("java2"); al.add("java3"); al.add("java4"); sop("原集合是:"+al); //在指定位置添加元素 al.add(1,"java9");//相当于插入操作 //删除指定位置的元素 //al.remove(2); //修改元素 al.set(2,"java007"); //通过角标获取元素 sop("get(1):"+al.get(1)); sop(al); //获取所有元素 for(int x=0;x<al.size();x++) sop("al("+x+")="+al.get(x)); Iterator it = al.iterator(); while(it.hasNext()) sop("next="+it.next()); //通过indexOf获取对象的位置 sop("index="+al.indexOf("java2")); //获取子列表 List sub = al.subList(1,3);//包含1不包含3 sop("sub="+sub); } }
也可以修改(it.set();)还有一个特殊的方法hasPrevious();