ArrayList与LinkedList有什么区别
- 底层实现原理不同:
ArrayList底层实现是数组,LinkedList是双向链表
基于实现原理的不同
ArrayList更适合于随机查找
ArrayList指定下标查找元素是非常快的,例如arrayList.get(1),因为数组已经给元素分配好了内存空间,可以直接去取。
而LinkedList如果想去linkedList.get(1)的话需要去循环遍历。
但是LinkedList如果查询第一个元素和最后一个元素的话也是非常快速的,因为LinkedList持续记录了第一个和最后一个元素,可以使用linkedList.getFirst()和linkedList.getLast()获取,不涉及遍历。
LinkedList更适合于添加删除
ArrayList添加时两种方法:
arrayList.add(“a”)和arrayList.add(1,“a”),
arrayList.add(“a”)是在数组最后一个位置添加元素,ArrayList添加涉及到数组的扩容,当初始化一个ArrayList时,他的长度为0,当添加第一个元素时会给其分配一个10的长度,在我们执行add方法时,如果此时长度不足会去调用grow()扩容方法,每次扩容长度为上次的1.5倍,小数则会舍弃,即为10->15->22…
如果add时不需要扩容那么速度还是很快的,如果需要扩容时那么则会增加扩容的开销。
arrayList.add(1,“a”)是在指定位置添加元素
相应的arrayList.add(1,“a”)这种方式,如果原位置上已经有元素,那么会增加元素向后移动的开销。
对应的linkedList.add(“a”)则会在链表的最后增加一个元素,不会涉及到扩容,而另一种linkedList.add(1,“a”),这种插入操作的话LinkedList也需要循环去取到下标,那此时的速度取决于下标的大小。
2.LinkedList实现了deque接口,所以LinkedList还可以当做双端队列使用