java毕向东听课笔记22(集合框架-List集合共性方法)

来源:互联网 发布:网络摄像头网线接法 编辑:程序博客网 时间:2024/04/26 23:54

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不包含3sop("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不包含3sop("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不包含3sop("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不包含3sop("sub="+sub);}}



也可以修改(it.set();)还有一个特殊的方法hasPrevious();

0 0