文章迁移(二)

Collection的子接口中最重要的就是List和Set了,可以理解成黑社会大哥的左膀右臂,或者集合体系中的两大派系。接下来说一下这两大派系的特点以及这两大派系下的分支(子实现类)。

List(列表)是有序的Collection集合,这里的有序需要强调一下,并不是真的将集合中的元素排序,而是可以按照存储的先后顺序来获取元素(你怎么存的我就能怎么取出),而且可以通过索引来精确的访问元素,最重要的一点是List集合可以存储重复的元素,而Set是一个不包含重复元素的Collection集合,因此是否拥有重复元素是这两大派系的最主要的区别(HashSet有一个子类——LinkedHashSet,可以提供有序的Set集合,因此是否有序并不能成为区分这两大派系的主要依据),这是List和Set的底层数据结构所决定的。

List接口抽取了该类容器的公有方法,同样的不一一介绍了,注意一点,这其中有不少方法传参是索引值(index),比较典型的就是get(int index)方法,这里主要说一下listIterator()

ListIterator是Iterator接口的子接口之一,是只有List类型集合才有实现资格的迭代器接口,在Iterator的基础之上,ListIterator提供了迭代过程中对元素进行增删改的方法,下面看一段代码:

     List list = new ArrayList();

       list.add(“abc1”);

list.add(“abc3”);

list.add(“abc2”);

 

Iterator it = list.iterator();//新建一个普通的迭代器

while(it.hasNext()){

            Object obj = it.next();//这段代码在执行时在此处会发生ConcurrentModificationException(并发修改)异常,这个异常引发的原因是,迭代器在遍历取出集合中的元素时,集合自己对元素进行了其他操作,解决办法就是使用Iterator的子接口ListIterator,在迭代中对元素完成更多的操作

           

 

            if (obj.equals("abc2")) {

                list.add("abc4"); 

            }

            else{

                System.out.println(obj);

            }

        }

       System.out.println(list);

将上面的代码做如下修改即可

        ListIterator it = list.listIterator();

        while(it.hasNext()){

            Object obj = it.next();

            if(obj.equals("abc2")){

                it.add("abc2.5");

            }

   }

       System.out.println(list);

 

ListIterator另外提供了六种迭代过程中操作集合元素的方法,包括这里提到的add方法,以及逆序迭代的可行性方案等等,可自行查阅API文档。

List的众多子实现类中我们常用的不多,这里只介绍开发中最常用的两个:ArrayList和LinkedList.

这里就不得不说道数组型数据结构和链表型数据结构了。

ArrayList属于数组型数据结构,这种数据结构查询元素较快而增删数据较慢。ArrayList容器特点是将对象的索引值存放到一个数组当中,与相应对象建立键值关系。因为数组是连续的,在查找时可以快速锁定对象,缺点是对容器中的对象进行增删操作时,由于改变了数组的长度,操作节点后面的数据的索引值都会发生改变,所以与LinkedList相比,ArrayList增删较慢。

LinkedList属于链表型数据结构,这种数据结构增删元素较快而查询较慢。所谓链表可以理解成一个手拉手的小孩儿队列,这个队列中每个元素都和与它相邻的前一个和后一个元素有链接关系,其实就是每个元素都分别有一块空间用来存放前一个元素的索引和后一个元素的索引,当对容器进行增删(LinkedList的增删操作都与元素的索引相关,不信去看API)操作时,只需将相应索引位置上的元素存放的索引值做相关操作即可,该索引位置以后的元素不必大动干戈的做任何变动。但是查询元素时,由于链表结构并不是连续的,需要一次看每一个元素所存放的下个元素角标值直到找到想要操作的那个角标为止,所以相对而言查询较慢。

可以根据数据结构的不同来选择不同的容器应用于开发中。

posted @ 2017-12-18 15:35  谈笑千年  阅读(132)  评论(0编辑  收藏  举报