一、ArrayList和LinkedList的大致区别如下:
1.ArrayList是实现了基于动态数组的数据结构,LinkedList基于链表的数据结构。
2.对于随机访问get和set,ArrayList觉得优于LinkedList,因为LinkedList要移动指针。
2、测试两者的查询速率;
三、总结:
1.ArrayList是实现了基于动态数组的数据结构,LinkedList基于链表的数据结构。
2.对于随机访问get和set,ArrayList觉得优于LinkedList,因为LinkedList要移动指针。
3.对于新增和删除操作add和remove,LinedList比较占优势,因为ArrayList要移动数据。
4.Vector与ArrayList一样,也是通过数组实现的,不同的是它支持线程的同步,即某一时刻只有一个线程能够写Vector,避免多线程同时写而引起的不一致性,但实现同步需要很高的花费,因此,访问它比访问ArrayList慢。
二、以下写一个案例对ArrayList和LinkedList两者进行测试:
1、测试两者的增删效率;
private static long addList(List list) { long curTime = System.currentTimeMillis(); for(int i=0;i<Len;i++){ list.add(0,new Object()); } return System.currentTimeMillis()-curTime; } public static void main(String[] args) { System.out.println("这是ArrayList的添加速度:"+addList(new ArrayList())); System.out.println("这是LinkedList的添加速度:"+addList(new LinkedList())); } 结果: 这是ArrayList的添加速度:810 这是LinkedList的添加速度:10 |
public static void main(String[] args) { List ArrayList = addLists(new ArrayList()); List LinkedList = addLists(new LinkedList()); System.out.println("这是ArrayList的读取速度:"+timeList(ArrayList)); System.out.println("这是LinkedList的读取速度:"+timeList(LinkedList)); } //先给对应的list对象添加元素; private static List addLists(List list) { for(int i=0;i<Len;i++){ list.add(0,new Object()); } return list; } private static long timeList(List list) { long curTime = System.currentTimeMillis(); for(int i=0;i<list.size();i++){ } return System.currentTimeMillis()-curTime; } 结果: 这是ArrayList的读取速度:0 这是LinkedList的读取速度:3 |
ArrayList内部是使用可増长数组实现的,所以是用get和set方法是花费常数时间的,但是如果插入元素和删除元素,除非插入和删除的位置都在表末尾,否则代码开销会很大,因为里面需要数组的移动。
LinkedList是使用双链表实现的,所以get会非常消耗资源,除非位置离头部很近。但是插入和删除元素花费常数时间。
Vector属于线程安全级别的,但是大多数情况下不使用Vector,因为线程安全需要更大的系统开销(这里也可以添加一个Vector作一个测试,速率跟ArrayList是一样的,不多做介绍)。