说下Vector、ArrayList、LinkedList联系和区别?使用场景?
答案:线程安全:
ArrayList:
底层是数组实现的,线程不安全,查询和修改速度快,新增和删除速度慢。
LinkedList:
底层是双向链表,线程不安全,查询和修改速度慢,新增和删除速度快。
Vector:
底层是数组实现的,线程安全的,操作的时候使用synchronized进行加锁。
使用场景:
Vector已经很少使用了
增加和删除场景多使用LinkedList
查询和修改多使用ArrayList
如果需要保证线程安全,ArrayList应该怎么做,有几种方式?
自己写个包装类,根据业务加锁
Collections.synchronizedList(new ArrayList<>());使用synchronzied加锁
CopyOnWriteArrayList<>() 使用ReentrantLock加锁
CopyOnWriteArrayList和Collections.synchronizedList实现线程安全有什么区别?使用场景?
CopyOnWriteArrayList:
执行修改操作是,会拷贝一份新的数组进行操作,代价十分昂贵,在执行完修改后将原来集合指向新的集合来完成操作,源码里面用ReentrantLock可重入锁保证不会有多个线程同时拷贝一份数组。
场景:
读高性能,使用于读操作远远大于写操作(读的时候不需要加锁,删除和增加需要加锁,读多写少)
Collections.synchronizedList:线程安全的原因是因为它几乎在每个方法中都使用了synchronized同步锁。
场景:
写操作性能比CopyOnWriteArrayList好,读操作性能并不如CopyOnWriteArrayList。
CopyOnWriteArrayList的设计思想是怎么样的,有什么缺点?
答案:
设计思想:
读写分离+最终一致
缺点:
内存占用问题,写时复制机制,内存里面会同时存在两个对象的内存,旧的对象和新写入的对象,如果对象大则容易发生Yong GC和Full GC。
ArrayList的扩容机制?
注意:JDK1.7之前ArrayList默认大小是10,JDK1.7之后是0
为指定集合容量,默认是0,指定大小则集合大小为指定容量
ArrayList的元素个数大于其容量,扩容大小=原始大小+原始大小/2
网友评论