ArrayList和LinkedList集合有什么区别?

看到这个问题大家都觉得很简单是吗?

ArrayList查询快!LinkedList增删快!很简单的问题不是吗?

这样回答的话当然是对的,但是还不够!

有的人可能会说ArrayList底层是一个数组,所以查询快,LinkedList底层是一个链表,所以增删快.

这样回答的话当然比第一个更好,但是还是不够!

那么到底怎么回答才全面呢?直接上图!

数组


链表


那么为什么数组查询就快了呢?因为假设数组里面保存的是一组对象,每个对象都有内存大小,例如对象中有一个字段是int类型占用4个字节(只考虑实际数据占用的内存),数组在堆上的内存在数组被创建出来就被确定了是40个字节.如果我们要查找第9个对象,可以通过(9-1)*4=32,从33到36字节就是我们要找的对象.是不是很快呢?而链表却不能做到这样的效率.如上图,我们要找到A4,必须先找到A3,再先找到A2,再先找到A1.这样的查找效率会大大降低.

好了,说了查找,再说说插入,数组的插入也相当的浪费效率,如果要在数组内的某一个位置进行插入,需要先将插入位置的前面复制一份,然后在新的数组后面添加新的元素,最后将旧的数组后半部分添加的新的数组后面,而在链表中插入就变得相当简单了,比如我要在A3和A4中插入B,只需定位到A3的指针和A4的数据即可,将A3的指针指向B的值,将B的指针指向A4的值,B就插入进了链表.

说了那么多,怎么能不来点实际的呢?那么我们就来测一测吧!

ArrayList和LinkedList插入操作测试

测试代码:


测试结果:经过几次反复执行,时间差大概是2ms


ArrayList和LinkedList查询操作测试



测试结果:很不稳定,但是多测几次大概是在2ms左右

总结一下:这个数据量算小的了,所有效果不是很明显,(提一下ArrayList底层数组貌似有一个扩容效率的问题哟!感兴趣的小伙伴可以查一查,很有用的),就是说面试的时候,大家回答的都是不同链表的特点,有时候面试官比较刁钻,刨根问底!这个答案介意借鉴一下!测试有什么不对的地方希望大家指出.互相学习哟~

展开阅读全文

没有更多推荐了,返回首页