目录
ArrayList、LinkedList、Vector是Java集合框架中的三种数据结构,它们的相同点和不同点如下:
相同点:
- 都实现了List接口,可以存储有序的元素序列,可以允许重复元素的存在;
- 都支持随机访问(根据元素的索引访问元素),并且访问效率较高;
- 都支持添加、删除、修改等操作,可以动态调整集合中的元素数量;
- 都支持泛型,可以指定集合类型。
不同点:
- ArrayList和Vector底层都是基于数组来实现的,而LinkedList底层是基于双向链表来实现的;
- ArrayList和Vector都是线程不安全的(多线程),而Vector是线程安全的(单线程),因此在多线程环境中使用Vector可以保证数据安全;
- 在执行添加、删除等操作时,ArrayList和Vector需要移动元素,而LinkedList只需要修改相邻节点的指针,因此在执行大量的插入、删除操作时,LinkedList的效率更高;
- ArrayList和Vector的默认初始容量不同,ArrayList的默认初始容量为10;而Vector的默认初始容量为10,并且可以设置每次扩容的增长量。
插入删除的效率对比:
import java.util.ArrayList;
import java.util.LinkedList;
import java.util.Vector;
public class AddDelete {
public static void main(String[] args) {
//ArrayList的新增删除速度
ArrayList arrayList = new ArrayList();
long start1 = System.nanoTime(); //获取执行前的时间戳(精确到纳秒,因为系统层面的执行速度只有精确到纳秒起步的单位才足够准确)
for (int i = 0; i < 10000; i++) {
//循环新增删除一百万个元素
arrayList.add(i);
arrayList.remove(0);
}
long start2 = System.nanoTime(); //获取执行后的时间戳(精确到纳秒,因为系统层面的执行速度只有精确到纳秒起步的单位才足够准确)
System.out.println("ArrayList新增删除一百万个元素所用时间(纳秒):" + (start2 - start1));
//LinkedList的新增删除速度
LinkedList linkedList = new LinkedList();
long start3 = System.nanoTime(); //获取执行前的时间戳(精确到纳秒,因为系统层面的执行速度只有精确到纳秒起步的单位才足够准确)
for (int i = 0; i < 10000; i++) {
//循环新增删除一百万个元素
linkedList.add(i);
linkedList.remove(0);
}
long start4 = System.nanoTime(); //获取执行后的时间戳(精确到纳秒,因为系统层面的执行速度只有精确到纳秒起步的单位才足够准确)
System.out.println("LinkedList新增删除一百万个元素所用时间(纳秒):" + (start4 - start3));
//Vector的新增删除速度
Vector vector = new Vector();
long start5 = System.nanoTime(); //获取执行前的时间戳(精确到纳秒,因为系统层面的执行速度只有精确到纳秒起步的单位才足够准确)
for (int i = 0; i < 10000; i++) {
//循环新增删除一百万个元素
vector.add(i);
vector.remove(0);
}
long start6 = System.nanoTime(); //获取执行后的时间戳(精确到纳秒,因为系统层面的执行速度只有精确到纳秒起步的单位才足够准确)
System.out.println("Vector新增删除一百万个元素所用时间(纳秒):" + (start6 - start5));
}
}
控制台:
查询的效率对比:
import java.util.ArrayList;
import java.util.LinkedList;
import java.util.Vector;
public class Select {
public static void main(String[] args) {
//ArrayList的查询速度
ArrayList arrayList = new ArrayList();
for (int i = 0; i < 10000; i++) {
arrayList.add(i); //循环新增一万个元素
}
long start1 = System.nanoTime(); //获取执行前的时间戳(精确到纳秒,因为系统层面的执行速度只有精确到纳秒起步的单位才足够准确)
for (int i = 0; i < 10000; i++) {
arrayList.get(i); //循环查询一万个元素
}
long start2 = System.nanoTime(); //获取执行后的时间戳(精确到纳秒,因为系统层面的执行速度只有精确到纳秒起步的单位才足够准确)
System.out.println("ArrayList查询一百万个元素所用时间(纳秒):" + (start2 - start1));
//LinkedList的查询速度
LinkedList linkedList = new LinkedList();
for (int i = 0; i < 10000; i++) {
linkedList.add(i); //循环新增一万个元素
}
long start3 = System.nanoTime(); //获取执行前的时间戳(精确到纳秒,因为系统层面的执行速度只有精确到纳秒起步的单位才足够准确)
for (int i = 0; i < 10000; i++) {
linkedList.get(i);
}
long start4 = System.nanoTime(); //获取执行后的时间戳(精确到纳秒,因为系统层面的执行速度只有精确到纳秒起步的单位才足够准确)
System.out.println("LinkedList查询一百万个元素所用时间(纳秒):" + (start4 - start3));
//Vector的查询速度
Vector vector = new Vector();
for (int i = 0; i < 10000; i++) {
vector.add(i); //循环新增一万个元素
}
long start5 = System.nanoTime(); //获取执行前的时间戳(精确到纳秒,因为系统层面的执行速度只有精确到纳秒起步的单位才足够准确)
for (int i = 0; i < 10000; i++) {
vector.get(i);
}
long start6 = System.nanoTime(); //获取执行后的时间戳(精确到纳秒,因为系统层面的执行速度只有精确到纳秒起步的单位才足够准确)
System.out.println("Vector查询一百万个元素所用时间(纳秒):" + (start6 - start5));
}
}
控制台: