Java数据结构之表的增删对比---ArrayList与LinkedList之一

一、Java_Collections表的实现

  与c不同Java已经实现并封装了现成的表数据结构,顺序表以及链表。

  1、ArrayList是基于数组的实现,因此具有的特点是:1.有索引值方便查找,对于get和set操作花费常数时间,2.但是其缺点是:插入/删除某个数据的代价比较大。

      2、LinkedList是基于双链表实现,因此具有的特点是:1.基于链表方便插入与删除操作开销较小,2.但是不方便索引,不管是索引哪一个元素都需要从头开始逐次查找。

就增删操作下面举个简单例子:给出一个表(具体实现未知),将该表中偶数值的项删除,比如该表中的元素为:1,2,3,4,5,调用该方法后得到元素:1,3,5

//-----------------------------------------------------------

//该代码主要是用来说明顺序表与链表在增删上的操作消耗

 1 import java.util.ArrayList;
 2 import java.util.Iterator;
 3 import java.util.LinkedList;
 4 import java.util.List;
 5 import java.util.ListIterator;
 6 
 7 /**
 8  * 找到一个表list中偶数值的项,并删除 下面显示逐渐优化的过程 对比顺序表:arrayList与LinkedList。自己把握
 9  * 
10  * @author Administrator
11  * 
12  */
13 public class RemoveEvens {
14     public static void main(String[] args) {
15         List<Integer> list = new ArrayList<>();
16         list.add(1);
17         list.add(2);
18         list.add(3);
19         list.add(4);
20 
21         // removeEvensVer2(list);
22 
23         for (int i : list) {
24             System.out.println(i);
25         }
26     }
27 
28     // 基础版本
29     /*
30      * 对于ArrayList集合,get方法虽然较快,但是remove的时间消耗为二次时间,
31      * 对于linkedlist集合,暴露两个问题首先是对get的调用效率不是很高因此例程花费二次时间,而且同时对remove
32      * 的调用同样低效,因为要到达i的代价是昂贵的。
33      */
34     public static void removeEvensVer1(List<Integer> list) {
35 
36         int i = 0;
37         // 遍历列表,获得每一个元素
38         while (i < list.size()) {
39             // 当前项是偶数,就移除
40             if (list.get(i) % 2 == 0) {
41                 list.remove(i);
42             } else {
43                 i++;
44             }
45         }
46     }
47 
48     // 迭代器版本增强版本,避免并发修改异常
49     // 对于linkedlist的迭代器的remove方法只消耗常数时间项,该方法对于arraylist仍是无可救药
50     
51     public static void removeEvensVer2(List<Integer> list) {
52         Iterator<Integer> iterator = list.iterator();
53         while (iterator.hasNext()) {
54             if (iterator.next() % 2 == 0) {
55                 iterator.remove();
56             }
57         }
58     }
59 
60     // 并发修改异常,一般这里会出现,主要是由于迭代器的引用失效
61     public static void removeEvensVer3(List<Integer> list) {
62         // ListIterator<Integer> listIterator = list.listIterator();
63         //增强for本质上是使用迭代器实现,而list的remove方法导致list发生变化,进一步导致原list的迭代器引用
64         //发生变化,导致并发异常。
65         for (Integer x : list) {
66             if (x % 2 == 0) {
67                 list.remove(x);
68             }
69         }
70     }
71 }

 

posted @ 2016-10-29 10:49  我所向往的美好  阅读(784)  评论(0编辑  收藏  举报