面试专题一:List

2 篇文章 0 订阅

根据小滴课堂面试专题整理
1.说下Vector和ArrayList、LinkedList联系和区别?分别的使用场景

  • 线程安全
    ArrayList:底层是数组实现,线程不安全,查询和修改非常快,但是增加和删除慢
    LinkedList: 底层是双向链表,线程不安全,查询和修改速度慢,但是增加和删除速度快
    Vector: 底层是数组实现,线程安全的,操作的时候使用synchronized进行加锁
  • 使用场景
    Vector已经很少用了
    增加和删除场景多则用LinkedList
    查询和修改多则用ArrayList

2.如果需要保证线程安全,ArrayList应该怎么做,用有几种方式
方式一:自己写个包装类,根据业务一般是add/update/remove加锁

方式二:Collections.synchronizedList(new ArrayList<>()); 使用synchronized加锁

方式三:CopyOnWriteArrayList<>() 使用ReentrantLock加锁

3.了解CopyOnWriteArrayList吗?和 Collections.synchronizedList实现线程安全有什么区别, 使用场景是怎样的?

CopyOnWriteArrayList:执行修改操作时,会拷贝一份新的数组进行操作(add、set、remove等),代价十分昂贵,在执行完修改后将原来集合指向新的集合来完成修改操作,源码里面用ReentrantLock可重入锁来保证不会有多个线程同时拷贝一份数组

场景:读高性能,适用读操作远远大于写操作的场景中使用(读的时候是不需要加锁的,直接获取,删除和增加是需要加锁的, 读多写少)

Collections.synchronizedList:线程安全的原因是因为它几乎在每个方法中都使用了synchronized同步*锁

场景:写操作性能比CopyOnWriteArrayList好,读操作性能并不如CopyOnWriteArrayList

4.CopyOnWriteArrayList的设计思想是怎样的,有什么缺点?

答案:设计思想:读写分离+最终一致

缺点:内存占用问题,写时复制机制,内存里会同时驻扎两个对象的内存,旧的对象和新写入的对象,如果对象大则容易发生Yong GC和Full GC

  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值