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辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。
禁止转载,如需转载请通过简信或评论联系作者。

相关阅读更多精彩内容

  • 概念 在Java中List有两个,一个是java.util下的接口,另一个是java.awt下的类,这里只讨...
    still_loving阅读 5,235评论 0 1
  • 写在前面 作为Android开发者,Java集合可能是开发中最常使用的类之一了。但很多人可能跟我一样,对Java集...
    安卓大叔阅读 10,533评论 0 23
  • List是有序,元素可重复的Collection,实现List接口的常用类有ArrayList,LinkedLis...
    spiritTalk阅读 3,468评论 0 0
  • 转载 list 几种循环遍历,性能对比 arrayListfor cost time ------ : 3for...
    Snail127阅读 2,924评论 0 0
  • 看过《龙族》的人,大概都忘不了那个蹬着十厘米的高跟鞋穿着深紫套裙走进放映厅的天使般的女孩。红发飞扬,眸如点漆,正像...
    兰浥尘阅读 3,633评论 0 0

友情链接更多精彩内容