`

Java集合与循环:主要对比ArrayList和LinkedList

阅读更多

 

一般大家都知道ArrayList和LinkedList的大致区别:

     1.ArrayList是实现了基于动态数组的数据结构,LinkedList基于链表的数据结构。

     2.对于随机访问get和set,ArrayList绝对优于LinkedList,因为LinkedList要从前到后移动指针。

     3.对于新增和删除操作add和remove,LinkedList比较占优势,因为ArrayList要移动数据。

 其实,Linkedlist相较于Arraylist的唯一优势在于集合前段部分的数据的插入,中后段的数据插入效率依然不如ArrayList。

 

Java中,对于集合的循环常见形式有:下标For循环、ForEach循环、普通迭代循环(list.iterator())、针对List的迭代循环(list.listIterator())、以及相应的While循环。

1. 循环效率(针对数组实现的集合)

各循环效率的对比,其实要看循环的数据量的数量级,以及集合包含的单个对象的大小。

一般而言,while循环与for循环的效率上的区别并不大。

         对于线性数组集合而言,如果循环的数量级越大,下标循环的效率越高。请看以下10次执行平均值数据(ArrayList(Integer)),时间单位为nanosecond。

循环数量级

10

1000

100000

10000000

 

average

average

average

average

listForLoop(下标)

5513

103490

6688946

51902989

listForEach

126454

321838

10066022

54252235

listForIterator

4562

307999

9226809

53535675

listForListIterator

117330

306592

9236961

56553463

listWhileLoop(下标)

1635

119839

5978926

54596847

listWhileIterator

4372

321078

9301785

56176724

listWhileListIterator

5703

318683

9342504

61759977

         由表格数据可以看出,下标循环的优势是显而易见的,在千万级的数据量时,反而这种差距会缩小。因为ArrayList本身就是使用数组实现的,所以用下标来取其中的元素,是一种很直接的方式,开销也小。但是下标循环和foreach循环都是不支持在循环过程中改变集合,而普通迭代与list迭代都是支持改变集合的。

         所以一般不推荐使用foreach循环,因为不仅效率低,而且循环过程中,改变集合会报异常(ConcurrentModificationException)。如果是在多线程编程中,一般减少使用下标循环,而使用foreach和迭代循环,会比较安全。

 

2. 测试过程中的循环代码如下:

a. listForLoop:

	public long listForLoop(ArrayList<Integer> list) {
		long start =0L,end=0L;
		@SuppressWarnings("unused")
		Integer s = null;
		start=System.nanoTime();
		for (int i = 0,len = list.size(); i < len; i++) {
			s = list.get(i);
		}
		end = System.nanoTime();
		return end-start;
	}
 

b. listForEach:

	public long listForEach(ArrayList<Integer> list) {
		long start =0L,end=0L;
		@SuppressWarnings("unused")
		Integer s = null;
		start=System.nanoTime();
		for (Integer i : list) {
			s = i;
		}
		end = System.nanoTime();
		return end-start;
	}

 

c. listForIterator:

	public long listForIterator(ArrayList<Integer> list) {
		long start =0L,end=0L;
		@SuppressWarnings("unused")
		Integer s = null;
		start=System.nanoTime();
		for (Iterator it = list.iterator(); it.hasNext();) {
			s = (Integer) it.next();
		}
		end = System.nanoTime();
		return end-start;
	}

 

d. listForListIterator:

	public long listForListIterator(ArrayList<Integer> list) {
		long start =0L,end=0L;
		@SuppressWarnings("unused")
		Integer s = null;
		start=System.nanoTime();
		for (Iterator it = list.listIterator(); it.hasNext();) {
			s = (Integer) it.next();
		}
		end = System.nanoTime();
		return end-start;
	}

 

e. listWhileLoop:

	public long listWhileLoop(ArrayList<Integer> list) {
		long start =0L,end=0L;
		@SuppressWarnings("unused")
		Integer s = null;
		int len = list.size();
		start=System.nanoTime();
		int i = 0;
		while (i<len) {
			s=list.get(i);
			i++;
		}
		end = System.nanoTime();
		return end-start;
	}

 

f.  listWhileIterator:

	public long listWhileIterator(ArrayList<Integer> list) {
		long start =0L,end=0L;
		@SuppressWarnings("unused")
		Integer s = null;
		start=System.nanoTime();
		Iterator it = list.iterator();
		while (it.hasNext()) {
			s=(Integer) it.next();
		}
		end = System.nanoTime();
		return end-start;
	}

 

g. listWhileListIterator:

	public long listWhileListIterator(ArrayList<Integer> list) {
		long start =0L,end=0L;
		@SuppressWarnings("unused")
		Integer s = null;
		start=System.nanoTime();
		Iterator it = list.listIterator();
		while (it.hasNext()) {
			s=(Integer) it.next();
		}
		end = System.nanoTime();
		return end-start;
	}

 

 

3. 具体list.iterator()与list.listIterator(迭代的区别如下:

a、ListIterator有add()方法,可以向List中添加对象,而Iterator不能。

b、ListIterator和Iterator都有hasNext()和next()方法,可以实现顺序向后遍历。但是ListIterator有hasPrevious()和previous()方法,可以实现逆向(顺序向前)遍历。Iterator就不可以。

c、ListIterator可以定位当前的索引位置,nextIndex()和previousIndex()可以实现。Iterator 没有此功能。

d、都可实现删除对象,但是ListIterator可以实现对象的修改,set()方法可以实现。Iterator仅能遍历,不能修改对象的引用。

 

 

分享到:
评论
1 楼 zendly 2016-03-04  
  

相关推荐

    Java 集合类(HashSet、ArrayList、LinkedList、HashMap).pptx

    掌握List集合、Set集合、Map集合的使用以及Iterator迭代器和foreach循环的使用 了解常用的集合类 熟悉泛型的使用

    40道java集合面试题含答案(很全很详细)

    Java集合类主要包括两种类型的容器:Collection和Map。Collection容器存储一个元素集合,包括List、Set和Queue等类型。Map容器存储键/值对映射。 Collection接口是List、Set和Queue接口的父接口,定义了存取一组...

    Java集合框架完整说明便于了解集合

    java集合在日常开发中经常用到,对基础的掌握尤其重要,其中List,Set,Map的作用以及使用的场景和分类描述,其中Arraylist 与 LinkedList 区别,HashSet与TreeSet与LinkedHashSet对⽐,LinkedHashMap和HashMap,...

    Java集合框架常见面试题.pdf

    剖析⾯试最常⻅问题之 Java 集合框架 集合概述 Java 集合概览 从下图可以看出,在 Java 中除了以 ...LinkedList : 双向链表(JDK1.6 之前为循环链表,JDK1.7 取消了循环) Set HashSet (⽆序,唯⼀): 基于 HashMap 实

    Java知识集.docx

    Java知识集是Java编程语言的核心概念和技术,涵盖了Java编程语言的基础知识、面向对象编程、...集合类:包括ArrayList、LinkedList、HashSet、TreeSet等集合类的使用。 反射机制:包括Class、Method、Field等类的使用。

    Java 基础核心总结 +经典算法大全.rar

    《Java 基础核心总结》 Java 概述 什么是 Java2 Java 的特点Java ...JDK Proxy 和 CGLIB 的对比动态代理的实际应用 Spring AOP 变量 变量汇总实例变量 实例变量的特点全局变量 静态变量 静态变量的特点类变量 局部变量

    Java基础知识点.html

    哈希值 LinkedHashSet TreeSet 自然排序Comparable 比较器排序Comparator Set集合 并发修改异常 LinkedList集合 ArrayList集合 List集合 Collection集合概述 冒泡排序 Object 异常 Math 包装类 Calendar类 ...

    java内部学习笔记.docx

    4.14 List集合的实现类ArrayList和LinkedList 39 4.15 Iterator迭代器 42 4.16泛型 43 4.17增强型for循环 43 4.18 List高级-数据结构:Queue队列 44 4.19 List高级-数据结构:Deque栈 44 4.20 Set集合的实现类...

    java集合详解与总结

    List: 有顺序的,元素可以重复 ...LinkedList:底层用双向循环链表 实现的List 特点:查询效率低,增删效率高 Vector: 底层用数组实现List接口的另一个类 特点:重量级,占据更多的系统开销 线程安全

    List集合之ArrayList

    ArrayList集成AbstractList抽象类,实现了List、RandomAccess、Cloneable、java.io.Serializable这四个接口,其中我们可以看到,实现了Cloneable和Serializable接口就代表着ArrayList是支持克隆和序列化的,这里有个...

    java基础核心总结归纳---参考手册--心得手册-学习资料-总结经验

    与 Exception 有关的 Java 关键字 19 什么是 Error 20 内部类 20 集合 20 ArrayList 21 Vector 21 LinkedList 21 Stack 21 HashSet 22 TreeSet 22 LinkedHashSet 22 HashMap 23 集合实现类特征图 23 泛形 23 反射 24...

    java jdk实列宝典 光盘源代码

    java为数据结构中的列表定义了一个接口类java.util.list同时提供了3个实现类,分别是ArrayList、Vector、LinkedList使用; 生成不重复的随机数序列;列表、集合与数组的互相转换;java为数据结构中的映射定义一个接口...

    疯狂JAVA讲义

    7.4.2 ArrayList和Vector实现类 264 7.4.3 固定长度的List 266 7.5 Queue接口 266 7.5.1 LinkedList实现类 266 7.5.2 PriorityQueue实现类 269 7.6 Map 270 7.6.1 HashMap和Hashtable实现类 271 7.6.2 ...

    java8集合源码分析-Outline:大纲

    java8 集合源码分析 JAVA: 基本语法 static 修饰变量 方法 静态块(初始化块 构造函数 ) 静态内部类() 静态导包 final() transient() foreach循环原理() volatile底层实现() equals和hashcode(, ) string,...

    java基础案例与开发详解案例源码全

    11.1 Java集合框架概述264 11.2 Collection接口264 11.2 Set接口实现类266 11.2.1 实现类HashSet267 11.2.2 实现类LinkHashSet270 11.2.3 实现类TreeSet272 11.3 List接口实现类277 11.3.1 实现类ArrayList277 ...

    JAVA入门学习笔记(1)– Collection集合的基础知识

    集合类4.1 集合的实现类4.1.1 ArrayList 4.1.2 LinkedList 4.1.3 Vecotor4.1.4 HashSet 4.1.5 LinkedHashSet 4.2 Conllections工具类5. 集合的遍历5.1 迭代器5.2 增强for循环(jdk1.5+)* 附加知识点1.数据结构1.1 栈...

    AIC的Java课程1-6章

     学习ArrayList与LinkedList类,理解封装数组和链表两种方式定义集合类。  可以使用迭代器Iterator遍历集合的元素。  [*]理解泛型概念,声明和使用带有范型的集合。 第11章 集合 4...

    JavaRushHomeWork:我的课程任务 javarush.ru

    02 Java 简介:变量、方法、类03 第一个程序:键盘输入,在IDE中工作04 引入分支和循环05 介绍类:编写自己的类、构造函数06 认识对象:编写自己的对象、生命周期、静态变量07 数组和列表:数组,ArrayList。...

Global site tag (gtag.js) - Google Analytics