ArrayList和Linked的区别
- 首先,底层数据结构不同,ArrayList底层是基于数组实现的,Linked底层是基于链表实现的
- 由于底层数据结构不同,所使用的场景也不同,ArrayList更是个随机查找,LinkedList更适合删除和添加,查询、添加、删除的时间复杂度不同
- 另外ArrayList和LinkedList都实现了List接口,但是LinkedList还额外实现的Deque接口,所以LinkedList还可以当做队列来使用
查询
ArrayList arrayList = new ArrayList();
LinkedList linkedList = new LinkedList();
//两个通过下标查询,但是通过下标查询也有一定区别
arrayList.get(1);
linkedList.get(1);
// arrayList底层是基于数组实现,可以通过下标直接获取,但是linkedList底层基于链表实现的,
//所以,LinkedList的get方法传入的下标是要通过遍历去查询下标
所以在查询方面,ArrayList要比LinkedList更适合,但是LinkedList中有两个特殊的方法,**getFirst()和getLast()**方法,获取第一个元素和最后一个元素,在LinkedList中有两个属性,一个是first一个是last,一直持续记录链表中的第一个元素和最后一个元素的位置
添加
在添加方面ArrayList有两个添加的方法,add(元素)和add(下标,元素)
使用add(元素)方法添加,会直接添加到数组的最后一个位上
当然,数组的添加可能会涉及到数组的扩容,如果不需要扩容,添加肯定是很快的,但是如果涉及到扩容,那么添加肯定涉及到扩容的一个成本的
使用add(index,element)方法去向指定位置添加元素,会涉及到数组的移动,比如我使用arrayList.add(1,2);方法,但是如果这个数组下标为1的地方有元素,那么我需要把原本位置的元素包括后面下标的元素,全部往后移动,然后将元素添加到这个位置
而LinkedList的插入,也是同样的add(element)方法和add(index,element)方法
而使用add(index,element)方法,会首先判断传入的下标是否跟集合大小相等,如果相等,直接将Node设置为最后一个元素,否则调用linkBefore()方法先遍历出下标指定位置上面原有的元素,如果指定下标数字比较大,那么遍历肯定是比较麻烦的
单从插入来讲,区别并不是很大,效率视使用场景而定