JAVA常用技术及面试常见问题之List篇

一、VectorArrayListLinkedList联系和区别?分别的使⽤场景

线程安全:
ArrayList :底层是数组实现,线程不安全,查询和修改⾮常快(查询修改的时候只需要根据下标找到元素操作就行了),但是增加和删除慢(增加删除需要移动很多个元素)。
线程不安全原因是,他的底层add方法并没有加锁。

 

LinkedList: 底层是双向链表,线程不安全,查询和修改速度慢,但是增加和删除速度快。
增加和删
线程不安全原因是,他的底层add方法并没有加锁。
Vector: 底层是数组实现,线程安全的,操作的时候使⽤ synchronized 进⾏加锁。

 

使⽤场景:
Vector 已经很少⽤了
增加和删除场景多则⽤ LinkedList
查询和修改多则⽤ ArrayList

二、我们知道ArrayList不是线程安全的。如果需要保证线程安全,ArrayList应该怎么做,⽤有⼏种⽅式?

⽅式⼀:⾃⼰写个包装类,根据业务⼀般是add/update/remove加锁
⽅式⼆:List<String> list = Collections.synchronizedList(new ArrayList<>()); get没有加锁,add、set、remove使⽤synchronized加锁

 

⽅式三:CopyOnWriteArrayList<>() 使⽤ReentrantLock加锁(get没有加锁,add、set、remove使⽤synchronized加锁)
详解CopyOnWriteArrayList:
如果调用了add方法增加一个元素,那么它会先将原来的数组复制一份,然后将新数组的长度进行+1操作,再将需要增加的元素增加到新数组,此时内存当中有新旧两个数组,最后将老数组的引用指向新数组。

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

m0_38041697

请各位老板打赏

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值