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 }
开始在code,我的个人特色。