码迷,mamicode.com
首页 > 编程语言 > 详细

【JAVA集合框架之List】

时间:2014-10-07 19:57:34      阅读:250      评论:0      收藏:0      [点我收藏+]

标签:style   blog   http   color   io   os   使用   ar   java   

五、List接口。

List有个很大的特点就是可以操作角标。

下面开始介绍List接口中相对于Collection接口比较特别的方法。在Collection接口中已经介绍的方法此处就不再赘述。

1.添加

 void add(int index, E element) 
          在列表的指定位置插入指定元素(可选操作)。
 boolean addAll(int index, Collection<? extends E> c) 
          将指定 collection 中的所有元素都插入到列表中的指定位置(可选操作)。

这两个方法相对于Collection接口,可以直接在特定的地方插入新的元素或者集合。

2.删除。

 E remove(int index) 
          移除列表中指定位置的元素(可选操作)。

这个方法相对于Collection接口来说,可以直接删除特定位置上的元素。

3.修改

 E set(int index, E element) 
          用指定元素替换列表中指定位置的元素(可选操作)。

这个方法可以将指定位置上的元素替换为另外一个元素(对象)。

4.查找

 E get(int index) 
          返回列表中指定位置的元素。
 int indexOf(Object o) 
          返回此列表中第一次出现的指定元素的索引;如果此列表不包含该元素,则返回 -1。
 int lastIndexOf(Object o) 
          返回此列表中最后出现的指定元素的索引;如果列表不包含此元素,则返回 -1。
 List<E> subList(int fromIndex, int toIndex) 
          返回列表中指定的 fromIndex(包括 )和 toIndex(不包括)之间的部分视图。

可以看出,上述List所有特有的方法都是和角标操作有关的,这是和List“有序”特点造成的。

5.List接口的特有方法:listIterator

 ListIterator<E> listIterator() 
          返回此列表元素的列表迭代器(按适当顺序)。
 ListIterator<E> listIterator(int index) 
          返回列表中元素的列表迭代器(按适当顺序),从列表的指定位置开始。

案例:

bubuko.com,布布扣
 1 package p01.BaseCollectionDemo;
 2 
 3 import java.util.ArrayList;
 4 import java.util.Iterator;
 5 import java.util.List;
 6 
 7 public class ListIteratorDemo {
 8 
 9     public static void main(String[] args)
10     {
11         List  al=new ArrayList();
12         al.add("abc1");
13         al.add("abc2");
14         al.add("abc3");
15         al.add("abc4");
16         Demo1(al);
17     }
18 
19     private static void Demo1(List al) {
20         for(Iterator it=al.iterator();it.hasNext();)
21         {
22             String str=(String)it.next();
23             System.out.println(str);
24             if(str=="abc1")
25             {
26                 al.add("abc5");
27             }
28         }
29     }
30     
31 
32 }
View Code

运行结果出现了异常:

bubuko.com,布布扣

分析:查看API,可以得到API对ConcurrentModificationException异常的描述:当方法检测到对象的并发修改,但不允许这种修改时,抛出此异常。程序首先是单线程,怎么就对对象作了并发修改呢?真正的原因是,迭代器在遍历之前就已经确定了容器内对象的数量,如果容器内再增加对象,迭代器将无法确定容器内对象的个数。迭代器在迭代对象,而add方法在添加对象,这就造成了对对象的并发修改。API对此类异常的说明是:如果单线程发出违反对象协定的方法调用序列,则该对象可能抛出此异常。例如,如果线程使用快速失败迭代器在 collection 上迭代时直接修改该 collection,则迭代器将抛出此异常。简单来说,不允许迭代的时候集合对元素进行修改。

解决方法:使用ListIterator迭代器。

ListIterator迭代器是List专门的迭代器,对其他集合的迭代并不适用。

bubuko.com,布布扣
 1 package p01.BaseCollectionDemo;
 2 
 3 import java.util.ArrayList;
 4 import java.util.Iterator;
 5 import java.util.List;
 6 import java.util.ListIterator;
 7 
 8 public class ListIteratorDemo {
 9 
10     public static void main(String[] args)
11     {
12         List  al=new ArrayList();
13         al.add("abc1");
14         al.add("abc2");
15         al.add("abc3");
16         al.add("abc4");
17 //        Demo1(al);
18         Demo2(al);
19     }
20 
21     private static void Demo2(List al) {
22         for(ListIterator li=al.listIterator();li.hasNext();)
23         {
24             String str=(String)li.next();
25             if(str.equals("abc1"))
26             {
27                 li.add("abc5");
28             }
29         }
30         System.out.println(al);
31         
32     }
33 
34     private static void Demo1(List al) {
35         for(Iterator it=al.iterator();it.hasNext();)
36         {
37             String str=(String)it.next();
38             System.out.println(str);
39             if(str=="abc1")
40             {
41                 al.add("abc5");
42             }
43         }
44     }
45     
46 
47 }
View Code

运行结果:

[abc1, abc5, abc2, abc3, abc4]

解决问题的关键就是使用ListIterator中的add方法添加元素。也就是说无论是迭代还是修改元素,都交给ListIterator来完成。迭代的时候集合对元素进行修改仍然是不允许的。

ListIterator listIterator(int index);方法则是指定了迭代的位置,这个位置可以自行制定,而默认(无参)的情况下是0。

此外,ListIterator还提供了比较有趣的两个方法:

 boolean hasPrevious() 
          如果以逆向遍历列表,列表迭代器有多个元素,则返回 true
 E previous() 
          返回列表中的前一个元素。

通过这两个方法可以实现逆向遍历。

6.List接口常用“子类”的特点。

List下有三个类比较常用:Vector、ArrayList、LinkedList。

6.1Vector类。

Vector类自JDK1.0就出现了,它可以说是集合框架的元老级干部。集合框架自JDK2.0出现以后,Vector类就加入了集合框架的队伍并归入了List旗下。Vector类的最大特点就是线程安全,这在整个集合框架中都是少见的。正是因为线程安全,所以执行效率低下,到了现在几乎已经废弃。即使在多线程编程中也不会使用它,而是使用ArrayList加锁代替。Vector内部是一个数组结构,并且是可增长的,步长为100%。Vector增删查询都很慢。

6.2ArrayList类。

ArrayList类是为了替代Vector类而出现的,所以它的功能几乎和Vector类完全相同,但它是非同步的。ArrayList内部也维护了一个变长的数组,增长的步长为50%,查询速度很快。

7.LinkedList类。

LinkedList是List接口链接列表实现。也就是说我们说的链表。LinkedList最大的特点就是增删速度非常快。

8.LinkedList和ArrayList都有get方法,有什么区别?

两者虽然都是List的子类,但是ArrayList的底层是数组数据结构,在内存中是连续的,所以使用get方法并不用从头开始查找;但是LinkedList底层是链表数据结构,即使使用了get方法,但是仍然需要从头开始查找。

【JAVA集合框架之List】

标签:style   blog   http   color   io   os   使用   ar   java   

原文地址:http://www.cnblogs.com/kuangdaoyizhimei/p/4009702.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!