ArrayList和HashMap、Set

   日期:2020-07-13     浏览:88    评论:0    
核心提示:ArrayList底层是数组,传的是一个Object泛型初始值长度10,jdk8是空(采用懒加载机制)扩容会变成10+10/2=15HashMap初始值16达到扩容条件则会按照原始的大小的一倍扩容就会变成16+16*2=48

List、Set、Map都是线程不安全的

ArrayList

底层是数组,传的是一个Object泛型
初始值长度10,jdk8是空(采用懒加载机制)
扩容会变成10+10/2=15
ArrayList 是线程不安全的

  1. ArrayList的故障现象
  2. 导致原因
  3. 解决方法
  4. 优化建议

异常:
多个线程进行add可能会报java.util.ConcurrentModificationException异常
导致原因:
多个线程同时写入同一个位置
解决方法:
解决多线程并发写入异常使用
优化建议:
1.new Vector<>()
2.Collections.synchronizedList(new ArrayList<>());
3.new CopyOnWriteArrayList();
建议是呀new CopyOnWriteArrayList();

 @Test
 public void ttt(String[] args) {
     List list = new CopyOnWriteArrayList();
     for (int i = 0; i < 40; i++) {
         new Thread(() -> {
             list.add(UUID.randomUUID().toString().substring(0, 8));
             System.out.println(list);
         }, String.valueOf(i)).start();
     }
 }

HashMap

初始值16
达到扩容条件则会按照原始的大小的一倍扩容
就会变成16+16*2=48

解决并发过程中线程不安全的方式是使用Map<String,String> map= new ConcurrentHashMap<>();

Set

set也是不安全的和List一样会报同样的错误
Set的底层是HashMap
key是泛型E
value是Object

解决多线程不安全的方式是使用Set set = new CopyOnWriteArraySet<>();

 
打赏
 本文转载自:网络 
所有权利归属于原作者,如文章来源标示错误或侵犯了您的权利请联系微信13520258486
更多>最近资讯中心
更多>最新资讯中心
0相关评论

推荐图文
推荐资讯中心
点击排行
最新信息
新手指南
采购商服务
供应商服务
交易安全
关注我们
手机网站:
新浪微博:
微信关注:

13520258486

周一至周五 9:00-18:00
(其他时间联系在线客服)

24小时在线客服