点击“开发者技术前线”,选择“星标🔝”
让一部分开发者看到未来
ArrayList和LinkedList区别?
1.ArrayList是基于数组的数据结构,分配的是一段连续的内存空间。
transient Object[] elementData;
transient是一个关键字,它的作用可以总结为一句话:将不需要序列化的属性前添加关键字transient,序列化对象的时候,这个属性就不会被序列化。你可能会觉得奇怪,ArrayList可以被序列化的啊,源码可是实现了java.io.Serializable接口啊
ArrayList会默认帮我们初始化数组的大小为10;每次扩容为1.5陪size;
新增数据的时候效率低,因为新增一个元素的时候都要考虑数组的容量,即扩容判断,而后进行新增元素;
修改数据同样根据index索引查找修改;
删除数据的时候效率低,因为是连续的内存空间,除删除最后一个元素外,删除任一元素都会使数组中的元素进行移动;
查找数据可根据index索引快速查找;
2.LinkedList是基于链表的数据结构
不需要指定初始容量,链表中任何一个存储单元都可以通过向前或者向后的指针获取到前面或者后面的存储单元。在 LinkedList 的源码中,其存储单元用一个Node类表示:
private static class Node<E> {
E item;
Node<E> next;
Node<E> prev;
Node(Node<E> prev, E element, Node<E> next) {
this.item = element;
this.next = next;
this.prev = prev;
}
}
Node中包含了三个成员,分别是存储数据的item
,指向前一个存储单元的点 prev
和指向后一个存储单元的节点 next
,通过这两个节点就可以关联前后的节点,组装成为链表的结构,
对比以上:
优点:不需要考虑扩容的问题和连续的内存空间问题,在新增和删除的效率更好
缺点:缺少了索引,降低了查找元素的效率,对应也降低了修改元素的效率
ArrayList和LinkedList哪个更占空间?
LinkedList的占用空间更大,因为每个节点要维护指向前后地址的两个节点,但也不是绝对,如果刚好数据量超过ArrayList默认的临时值时,ArrayList占用的空间也是不小的,因为扩容的原因会浪费将近原来数组一半的容量,不过,因为ArrayList的数组变量是用transient关键字修饰的,如果集合本身需要做序列化操作的话,ArrayList这部分多余的空间不会被序列化。
更多阅读查看:
字节一面:SparseArray 和 HashMap区别?展开说说
写在最后:
最后给读者整理了一份大厂面试真题,需要的可扫码回复“大厂面试”获取。
— 完 —
点这里👇关注我,记得标星呀~
前线推出学习交流一定要备注:研究/工作方向+地点+学校/公司+昵称(如JAVA+上海 扫码加小编微信,进群和大佬们零距离
END 后台回复“电子书” “资料” 领取一份干货,数百面试手册等 历史推荐
字节一面:synchronized和volatile关键字的区别
好文点个在看吧!