Java集合List

说下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

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。
禁止转载,如需转载请通过简信或评论联系作者。

相关阅读更多精彩内容

友情链接更多精彩内容