为了账号安全,请及时绑定邮箱和手机立即绑定

06LinkedList

标签:
Java

2.1

  • LinkedList底层数据结构是一个双向链表,整体结构如下

图片描述

  • 追加链表可以选择追加到链表头部和链表尾部。

  • 结点查询某一个结点是比较慢的,需要挨个循环找才行,LinkedList并没有采用从头循环到尾的做法,而是采取了简单二分手法,使循环的次数至少降低了一半

2.2 迭代器

  • 因为LinkedList要实现双向的迭代访问,所以我们使用Iterator接口肯定不行了,因为Iterator只支持从头到尾的访问。Java新增了一个迭代接口,叫做:ListIterator,这个接口提供了向前和向后的迭代方法            

  • 迭代顺序方法
    从尾到头迭代方法hasPrevious、previous、previousIndex
    从头到尾迭代方法hasNext、next、nextIndex

2.3 相关面试题

  • 如果我连续往list里面新增值,增加到11个的时候,数组大小是多少?
    10+10/2=15 如果小于期望值  那么我们的期望值等于本次扩容的大小

  • 现在我有一个很大的数组需要拷贝,原数组大小是 5k,请问如何快速拷贝?

    答:因为原数组比较大,如果新建数组的时候,不指定数组大小的话,就会频繁扩容,频繁阔偶然那个就会有大量的拷贝工作,造成拷贝的性能底下。指定新数组的大小为5k

  • 为什么说扩容会消耗性能?
    答:扩容底层使用的是 System.arraycopy 方法,会把原数组的数据全部拷贝到新数组上,所以性能消耗比较严重。

  • 源码扩容过程有什么值得借鉴的地方?
    1.5 倍的扩容速度,可以让扩容速度在前期缓慢上升,在后期增速较快,大部分工作中要求数组的值并不是很大,所以前期增长缓慢有利于节省资源,在后期增速较快时,也可快速扩容。

  • 可以的,因为 Iterator.remove () 方法在执行的过程中,会把最新的 modCount 赋值给 expectedModCount,这样在下次循环过程中,modCount 和 expectedModCount 两者就会相等。

  • ArrayListed和LinkedList有何不同?

    ArrayList 底层是数组,LinkedList 底层是双向链表,两者的数据结构不同也导致了操作的 API 实现有所差异,拿新增实现来说,ArrayList 会先计算并决定是否扩容,然后把新增的数据直接赋值到数组上,而 LinkedList 仅仅只需要改变插入节点和其前后节点的指向位置关系即可。

  • ArrayList 和 LinkedList 两者有没有最大容量?

    答:ArrayList 有最大容量的,为 Integer 的最大值,大于这个值 JVM 是不会为数组分配内存空间的,LinkedList 底层是双向链表,理论上可以无限大。但源码中,LinkedList 实际大小用的是 int 类型,这也说明了 LinkedList 不能超过 Integer 的最大值,不然会溢出。

  •  ArrayList 和 LinkedList 是如何对 null 值进行处理的

    答:ArrayList 允许 null 值新增,也允许 null 值删除。删除 null 值时,是从头开始,找到第一值是 null 的元素删除;LinkedList 新增删除时对 null 值没有特殊校验,是允许新增和删除的。

  • ArrayList 和 LinedList 是线程安全的么,为什么?
    答:当两者作为非共享变量时,比如说仅仅是在方法里面的局部变量时,是没有线程安全问题的,只有当两者是共享变量时,才会有线程安全问题。主要的问题点在于多线程环境下,所有线程任何时刻都可对数组和链表进行操作,这会导致值被覆盖,甚至混乱的情况。

    如果有线程安全问题,在迭代的过程中,会频繁报 ConcurrentModificationException 的错误,意思是在我当前循环的过程中,数组或链表的结构被其它线程修改了。

  • 如何解决线程安全问题?
    Java 源码中推荐使用 Collections#synchronizedList 进行解决,Collections#synchronizedList 的返回值是 List 的每个方法都加了 synchronized 锁,保证了在同一时刻,数组和链表只会被一个线程所修改,或者采用 CopyOnWriteArrayList 并发 List 来解决

点击查看更多内容
1人点赞

若觉得本文不错,就分享一下吧!

评论

作者其他优质文章

正在加载中
感谢您的支持,我会继续努力的~
扫码打赏,你说多少就多少
赞赏金额会直接到老师账户
支付方式
打开微信扫一扫,即可进行扫码打赏哦
今天注册有机会得

100积分直接送

付费专栏免费学

大额优惠券免费领

立即参与 放弃机会
意见反馈 帮助中心 APP下载
官方微信

举报

0/150
提交
取消