`

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集合类详解(set list ArrayList等java集合类详述)

    Java 集合类是 Java 语言中的一种基本数据结构,用于存储和操作大量数据。集合类可以分为三大类:Collection、List 和 Set。 Collection 是集合框架中的根接口,提供了基本的集合操作,如 add、remove、contains 等...

    arraylist-linkedlist-test.zip

    ArrayList和LinkedList是Java集合框架中两种重要的动态数组实现,它们都是List接口的实现类,但它们在存储和操作数据方面有着显著的区别。本文件"arraylist-linkedlist-test.zip"主要探讨了在执行添加和删除元素操作...

    对ArrayList和LinkedList底层实现原理详解

    总结:ArrayList 和 LinkedList 是 Java 中两个常用的集合类,它们的底层实现方式不同,ArrayList 是基于数组实现的,而 LinkedList 是基于链表实现的。理解它们的底层实现方式可以帮助我们更好地使用它们。

    java 集合之实现类ArrayList和LinkedList的方法

    "java 集合之实现类ArrayList和LinkedList的方法" Java 集合框架中,ArrayList 和 LinkedList 是两种常用的实现类,分别实现了 List 接口。下面我们将详细介绍这两种实现类的方法。 ArrayList ArrayList 是一个...

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

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

    java集合类ArrayList总结共9页.pdf.zip

    Java集合框架是Java编程语言中一个非常重要的组成部分,它提供了数据结构和算法的实现,使得在处理各种数据集合时能够更加高效和灵活。ArrayList作为集合框架中的一个重要成员,它是基于数组实现的动态列表,允许...

    Java集合框架ArrayListJava开发Java经验

    4. 对比ArrayList和LinkedList:如果频繁进行插入和删除操作,LinkedList可能更适合,因为它在这些操作上的效率更高。但如果主要是访问和遍历,ArrayList则更为高效。 在实际的Java开发中,理解ArrayList与其他集合...

    学士后Java集合框架和泛型课后习题答案

    在Java中,集合框架主要包括接口(如List、Set、Queue)和实现这些接口的类(如ArrayList、HashSet、LinkedList等)。这个框架允许我们高效地处理各种数据结构,而无需从头开始编写代码。泛型则是Java 5引入的一项...

    第16章:Java集合.zip_java 集合_java集合

    本章内容主要围绕Java集合框架展开,包括ArrayList、LinkedList、HashSet、HashMap等常见数据结构的使用方法及其特点。 1. **集合接口**: - `Collection`:所有单值容器的根接口,包括List、Set等子接口。 - `...

    java集合类的效率测试

    本测试着重探讨了Java集合类中的Set接口实现类(如HashSet)以及List接口实现类(如ArrayList和LinkedList)在进行增、删、改、查操作时的性能差异。 首先,我们来看ArrayList。ArrayList是一个基于数组实现的列表...

    Java集合概述与实例分析

    - LinkedList:基于双向链表实现,插入和删除操作比ArrayList快,但随机访问性能较差,因为需要遍历链表。LinkedList还提供了特有的API,如addFirst、addLast、getFirst和getLast等。 2. Set接口:Set接口不保证...

    java ArrayList的使用与分析

    【Java ArrayList 使用与分析】 ArrayList 是 Java 集合框架中的一个重要组成部分,它是一个基于数组实现的可变大小的列表。ArrayList 类继承自 AbstractList 类并实现了 List 接口,这意味着它可以被用作一个有序...

    ArrayList和LinkedList区别及使用场景代码解析

    ArrayList和LinkedList都是Java集合框架中的重要成员,它们都是List接口的实现类,但它们在实现机制、性能和使用场景等方面存在着很大的差异。 ArrayList ArrayList是基于数组实现的,其构造函数为: ```java ...

    java基础for循环练习题

    对于集合框架,如ArrayList、LinkedList等,增强型`for`循环是首选,它能简洁地遍历集合中的所有元素。如果需要对集合进行更复杂的操作,比如删除元素,则可能需要使用基本的`for`循环配合迭代器。 5. **其他用法*...

    深入探索Java集合框架:解密复杂的面试题和精准解析

    本文将深入探讨Java集合框架的核心概念,包括List、Set、Map等接口,以及ArrayList、LinkedList、HashSet、HashMap等实现类,帮助你理解和解决面试中的相关问题。 1. **List和Set的区别及应用场景** - **List** 是...

    JAVA集合例子

    "JAVA集合例子"这个资源很可能是包含了一些关于Java集合使用的示例代码,帮助开发者更好地理解和运用这些集合类。集合框架主要由接口和实现类组成,如List、Set、Queue和Map等,它们为不同类型的数据组织提供了不同...

    java集合框架全面进阶

    Java集合框架主要由接口和类组成,如List、Set、Queue、Map等接口,以及ArrayList、LinkedList、HashSet、HashMap等实现类。 1. **List接口**:List接口是有序的集合,允许重复元素,并且元素都有索引。ArrayList和...

    java集合类的讲解文件

    这份讲解文件主要涵盖了Java集合框架的核心概念,包括接口和实现类。 首先,集合框架是一个类库的集合,其核心是提供了一种表示和操作集合的统一架构。它定义了多个接口,如: 1. **Collection**:集合层次的根...

    java常用集合类总结

    在这个总结中,我们将深入探讨Java集合框架中的主要组件,包括ArrayList、LinkedList、HashSet、HashMap等,并了解如何进行基本操作如添加元素、删除元素、遍历以及一些高级特性。 1. ArrayList与LinkedList: - ...

Global site tag (gtag.js) - Google Analytics