一般大家都知道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仅能遍历,不能修改对象的引用。
相关推荐
Java 集合类是 Java 语言中的一种基本数据结构,用于存储和操作大量数据。集合类可以分为三大类:Collection、List 和 Set。 Collection 是集合框架中的根接口,提供了基本的集合操作,如 add、remove、contains 等...
ArrayList和LinkedList是Java集合框架中两种重要的动态数组实现,它们都是List接口的实现类,但它们在存储和操作数据方面有着显著的区别。本文件"arraylist-linkedlist-test.zip"主要探讨了在执行添加和删除元素操作...
总结:ArrayList 和 LinkedList 是 Java 中两个常用的集合类,它们的底层实现方式不同,ArrayList 是基于数组实现的,而 LinkedList 是基于链表实现的。理解它们的底层实现方式可以帮助我们更好地使用它们。
"java 集合之实现类ArrayList和LinkedList的方法" Java 集合框架中,ArrayList 和 LinkedList 是两种常用的实现类,分别实现了 List 接口。下面我们将详细介绍这两种实现类的方法。 ArrayList ArrayList 是一个...
掌握List集合、Set集合、Map集合的使用以及Iterator迭代器和foreach循环的使用 了解常用的集合类 熟悉泛型的使用
Java集合框架是Java编程语言中一个非常重要的组成部分,它提供了数据结构和算法的实现,使得在处理各种数据集合时能够更加高效和灵活。ArrayList作为集合框架中的一个重要成员,它是基于数组实现的动态列表,允许...
4. 对比ArrayList和LinkedList:如果频繁进行插入和删除操作,LinkedList可能更适合,因为它在这些操作上的效率更高。但如果主要是访问和遍历,ArrayList则更为高效。 在实际的Java开发中,理解ArrayList与其他集合...
在Java中,集合框架主要包括接口(如List、Set、Queue)和实现这些接口的类(如ArrayList、HashSet、LinkedList等)。这个框架允许我们高效地处理各种数据结构,而无需从头开始编写代码。泛型则是Java 5引入的一项...
本章内容主要围绕Java集合框架展开,包括ArrayList、LinkedList、HashSet、HashMap等常见数据结构的使用方法及其特点。 1. **集合接口**: - `Collection`:所有单值容器的根接口,包括List、Set等子接口。 - `...
本测试着重探讨了Java集合类中的Set接口实现类(如HashSet)以及List接口实现类(如ArrayList和LinkedList)在进行增、删、改、查操作时的性能差异。 首先,我们来看ArrayList。ArrayList是一个基于数组实现的列表...
- LinkedList:基于双向链表实现,插入和删除操作比ArrayList快,但随机访问性能较差,因为需要遍历链表。LinkedList还提供了特有的API,如addFirst、addLast、getFirst和getLast等。 2. Set接口:Set接口不保证...
【Java ArrayList 使用与分析】 ArrayList 是 Java 集合框架中的一个重要组成部分,它是一个基于数组实现的可变大小的列表。ArrayList 类继承自 AbstractList 类并实现了 List 接口,这意味着它可以被用作一个有序...
ArrayList和LinkedList都是Java集合框架中的重要成员,它们都是List接口的实现类,但它们在实现机制、性能和使用场景等方面存在着很大的差异。 ArrayList ArrayList是基于数组实现的,其构造函数为: ```java ...
本文将深入探讨Java集合框架的核心概念,包括List、Set、Map等接口,以及ArrayList、LinkedList、HashSet、HashMap等实现类,帮助你理解和解决面试中的相关问题。 1. **List和Set的区别及应用场景** - **List** 是...
"JAVA集合例子"这个资源很可能是包含了一些关于Java集合使用的示例代码,帮助开发者更好地理解和运用这些集合类。集合框架主要由接口和实现类组成,如List、Set、Queue和Map等,它们为不同类型的数据组织提供了不同...
Java集合框架主要由接口和类组成,如List、Set、Queue、Map等接口,以及ArrayList、LinkedList、HashSet、HashMap等实现类。 1. **List接口**:List接口是有序的集合,允许重复元素,并且元素都有索引。ArrayList和...
这份讲解文件主要涵盖了Java集合框架的核心概念,包括接口和实现类。 首先,集合框架是一个类库的集合,其核心是提供了一种表示和操作集合的统一架构。它定义了多个接口,如: 1. **Collection**:集合层次的根...
在这个总结中,我们将深入探讨Java集合框架中的主要组件,包括ArrayList、LinkedList、HashSet、HashMap等,并了解如何进行基本操作如添加元素、删除元素、遍历以及一些高级特性。 1. ArrayList与LinkedList: - ...
Java 集合是 Java 语言中最基本的数据结构之一,通过了解 Java 集合的基本概念、种类、特点、迭代器、增强 for 循环等,可以更好地掌握 Java 集合的使用方法和优化技术,从而提高编程效率和代码质量。