以太坊高度(326681.com)_Java中的List你真的会用吗?
发表时间:2020-12-28 浏览量:12
Java中的List你真的会用吗?
Java中的List你真的会用吗?
List是Java中对照常用的聚集类,关于List接口有许多实现类,本文就来简朴先容下其中几个重点的实现ArrayList、LinkedList和Vector之间的关系和区别。
List
List 是一个接口,它继续于Collection的接口。它代表着有序的行列。当我们讨论List的时刻,一样平常都和Set作对照。
List中元素可以重复,并且是有序的(这里的有序指的是根据放入的顺序举行存储。如根据顺序把1,2,3存入List,那么,从List中遍历出来的顺序也是1,2,3)。
Set中的元素不可以重复,并且是无序的(从set中遍历出来的数据和放入顺序没有关系)。
下面是Java中的聚集类的关系图。从中可以大致领会聚集类之间的关系
java-collection-hierarchy
ArrayList、 LinkedList 和 Vector之间的区别
从上图可以看出,ArrayList、 LinkedList 和 Vector都实现了List接口,是List的三种实现,以是在用法上异常相似。他们之间的主要区别体现在差别操作的性能上。后面会详细分析。
ArrayList
ArrayList底层是用数组实现的,可以以为ArrayList是一个可改变巨细的数组。随着越来越多的元素被添加到ArrayList中,其规模是动态增添的。
LinkedList
LinkedList底层是通过双向链表实现的。以是,LinkedList和ArrayList之前的区别主要就是数组和链表的区别。
数组中查询和赋值对照快,由于可以直接通过数组下标接见指定位置。
链表中删除和增添对照快,由于可以直接通过修改链表的指针(Java中并无指针,这里可以简朴理解为指针。其实是通过Node节点中的变量指定)举行元素的增删。
以是,LinkedList和ArrayList相比,增删的速率较快。然则查询和修改值的速率较慢。同时,LinkedList还实现了Queue接口,以是他还提供了offer(), peek(), poll()等方式。
Vector
Vector和ArrayList一样,都是通过数组实现的,然则Vector是线程平安的。和ArrayList相比,其中的许多方式都通过同步(synchronized)处置来保证线程平安。
,www.326681.com采用以太坊区块链高度哈希值作为统计数据,联博以太坊统计数据开源、公平、无任何作弊可能性。联博统计免费提供API接口,支持多语言接入。
若是你的程序不涉及到线程平安问题,那么使用ArrayList是更好的选择(由于Vector使用synchronized,必然会影响效率)。
二者之间另有一个区别,就是扩容计谋不一样。在List被第一次建立的时刻,会有一个初始巨细,随着不停向List中增添元素,当List以为容量不够的时刻就会举行扩容。Vector缺省情况下自动增进原来一倍的数组长度,ArrayList增进原来的50%。
ArrayList 和 LinkedList的性能对比
使用以下代码对ArrayList和LinkedList中的几种主要操作所用时间举行对比:
ArrayList<Integer> arrayList = new ArrayList<Integer>();
LinkedList<Integer> linkedList = new LinkedList<Integer>();
// ArrayList add
long startTime = System.nanoTime();
for (int i = 0; i < 100000; i++) {
arrayList.add(i);
}
long endTime = System.nanoTime();
long duration = endTime - startTime;
System.out.println("ArrayList add: " + duration);
// LinkedList add
startTime = System.nanoTime();
for (int i = 0; i < 100000; i++) {
linkedList.add(i);
}
endTime = System.nanoTime();
duration = endTime - startTime;
System.out.println("LinkedList add: " + duration);
// ArrayList get
startTime = System.nanoTime();
for (int i = 0; i < 10000; i++) {
arrayList.get(i);
}
endTime = System.nanoTime();
duration = endTime - startTime;
System.out.println("ArrayList get: " + duration);
// LinkedList get
startTime = System.nanoTime();
for (int i = 0; i < 10000; i++) {
linkedList.get(i);
}
endTime = System.nanoTime();
duration = endTime - startTime;
System.out.println("LinkedList get: " + duration);
// ArrayList remove
startTime = System.nanoTime();
for (int i = 9999; i >=0; i--) {
arrayList.remove(i);
}
endTime = System.nanoTime();
duration = endTime - startTime;
System.out.println("ArrayList remove: " + duration);
// LinkedList remove
startTime = System.nanoTime();
for (int i = 9999; i >=0; i--) {
linkedList.remove(i);
}
endTime = System.nanoTime();
duration = endTime - startTime;
System.out.println("LinkedList remove: " + duration);
效果:
ArrayList add: 13265642
LinkedList add: 9550057
ArrayList get: 1543352
LinkedList get: 85085551
ArrayList remove: 199961301
LinkedList remove: 85768810
arraylist-vs-linkedlist1
他们的显示的差异是显而易见的。在添加和删除操作上LinkedList更快,但在查询速率较慢。
若何选择
若是涉及到多线程,那么就选择Vector(固然,你也可以使用ArrayList并自己实现同步)。
若是不涉及到多线程就从LinkedList、ArrayList中选。 LinkedList更适合从中心插入或者删除(链表的特征)。 ArrayList更适合检索和在末尾插入或删除(数组的特征)。
直面Java第144期:Java中的Class类是什么?他和反射另有什么关系?
成神之路第013期:Java聚集类—Map。
- MORE | 更多精彩文章 -
- Java 11正式公布,告诉你到底应不应该升级
- 营业太庞大?教你若何降低软件的庞大性
- 2018开发者手艺讲述,让你更领会自己的行业
- 线上防雪崩利器——熔断器设计原理与实现
若是你看到了这里,说明你喜欢本文。
那么请长按二维码,关注Hollis
转发朋友圈,是对我最大的支持。
0
珍藏