面试题list追杀篇

说下VectorArrayListLinkedList联系和区别?分别的使⽤场景

答案:
线程安全
ArrayList :底层是数组实现,线程不安全,查询和修改⾮常快,但是增加和删除慢
LinkedList: 底层是双向链表,线程不安全,查询和修改速度慢,但是增加和删除速度快
Vector: 底层是数组实现,线程安全的,操作的时候使⽤ synchronized 进⾏加锁
使⽤场景
Vector 已经很少⽤了
增加和删除场景多则⽤ LinkedList
查询和修改多则⽤ ArrayList

如果需要保证线程安全,ArrayList应该怎么做,⽤有⼏种⽅式

⽅式⼀:⾃⼰写个包装类,根据业务⼀般是 add/update/remove 加锁
⽅式⼆: Collections.synchronizedList(new ArrayList<>()); 使⽤ synchronized 加锁
⽅式三: CopyOnWriteArrayList<>() 使⽤ ReentrantLock 加锁

基于CopyOnWriteArrayList进⾏继续追问

如果回答到上⾯的点则继续问,没回到到则问,了解 CopyOnWriteArrayList 吗?
和 Collections.synchronizedList实现线程安全有什么区别 , 使⽤场景是怎样的?
CopyOnWriteArrayList :执⾏修改操作时,会拷⻉⼀份新的数组进⾏操作( add set
remove ) ,代价⼗分昂贵,在执⾏完修改后将原来集合指向新的集合来完成修改操作,源
码⾥⾯⽤ ReentrantLock 可重⼊锁来保证不会有多个线程同时拷⻉⼀份数组
场景:读⾼性能,适⽤读操作远远⼤于写操作的场景中使⽤ ( 读的时候是不需要加锁的,
直接获取,删除和增加是需要加锁的 , 读多写少 )
Collections.synchronizedList :线程安全的原因是因为它⼏乎在每个⽅法中都使⽤了
synchronized 同步 *
场景:写操作性能⽐ CopyOnWriteArrayList 好,读操作性能并不如
CopyOnWriteArrayList

CopyOnWriteArrayList的设计思想是怎样的,有什么缺点?

答案:设计思想:读写分离 + 最终⼀致
缺点:内存占⽤问题 , 写时复制机制 , 内存⾥会同时驻扎两个对象的内存,旧的对象和新写⼊的对象 ,
如果对象⼤则容易发⽣ Yong GC Full GC
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值