说下Vector和ArrayList、LinkedList联系和区别?分别的使⽤场景
答案:
线程安全
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