当前位置: 首页 > news >正文

Java集合面试小结(2)

1. 哪些集合类是线程安全的?

  • Vector:就比Arraylist多了个 synchronized (线程安全),因为效率较低,现在已经不太建议使用。
  • hashTable:就比hashMap多了个synchronized (线程安全),不建议使用。
  • ConcurrentHashMap:是Java5中支持高并发、高吞吐量的线程安全HashMap实现。它由Segment数组结构和HashEntry数组结构组成。Segment数组在ConcurrentHashMap里扮演锁的角色,HashEntry则用于存储键-值对数据。一个ConcurrentHashMap里包含一个Segment数组,Segment的结构和HashMap类似,是一种数组和链表结构;一个Segment里包含一个HashEntry数组,每个HashEntry是一个链表结构的元素;每个Segment守护着一个HashEntry数组里的元 素,当对HashEntry数组的数据进行修改时,必须首先获得它对应的Segment锁。(推荐使用)

2. Java集合的快速失败机制 “fail-fast”?

是java集合的一种错误检测机制,当多个线程对集合进行结构上的改变的操作时,有可能会产生fail-fast机制。

例如:假设存在两个线程(线程1、线程2),线程1通过Iterator在遍历集合A中的元素,在某个时候线程2修改了集合A的结构(是结构上面的修改,而不是简单的修改集合元素的内容),那么这个时候程序就会抛出ConcurrentModificationException异常,从而产生fail-fast机制。

        原因:迭代器在遍历时直接访问集合中内容,并且在 遍历过程中使用一个modCount 变量,集合在遍历时直接访问集合中的内容,并且在遍历过程中使用一个modCount变量。集合在被遍历

期间如果内容发生变化,就会改变modCount变量是否为expectedmodCount值,是的话就返回遍

历;否则抛出异常,终止遍历。

        解决办法:

1.在遍历过程中,所有涉及到改变modCount值得地方最全部加上synchronized.

2.使用CopyOnWriteArrayLIst来替换ArrayList;

3. 怎么确保一个集合不能被修改?

  • 可以使用 Collections. unmodififiableCollection(Collection c) 方法来创建一个只读集合,这样改变集合的任何操作都会抛出 Java. lang. UnsupportedOperationException 异常。
  • 示例代码如下:

List<String> list = new ArrayList<>();
list. add("x");
Collection<String> clist = Collections. unmodifiableCollection(list);
clist. add("y"); // 运行时此行报错
System. out. println(list. size());

相关文章:

  • 【uiautomation】微信群发消息,可发送文本 文件
  • 【network】windows 获取Adapter 名称
  • Python 基础学习
  • 网课搜题接口公众号搭建详细步骤
  • 继承的使用以及super关键字和重写以及Object类
  • Spring中的AOP翻转的使用与在事务管理中的表现
  • DataOps: A New Discipline 数据治理的下一步
  • 一些现代 Javascript 技巧
  • Java学习 --- 类方法(静态方法)
  • 网课答案搜题方法详细步骤
  • promise函数
  • 何云伟全国相声巡回演,首场定在北京吉祥戏楼,不知道送不送鸡蛋
  • 秋招面试!阿里、字节、美团等大厂面试我只刷这份《Java面试题》没想到还真拿下了offer!
  • Day741.Redis消息队列 -Redis 核心技术与实战
  • C 语言的特性
  • 2017-08-04 前端日报
  • 78. Subsets
  • Android Studio:GIT提交项目到远程仓库
  • angular2 简述
  • emacs初体验
  • iBatis和MyBatis在使用ResultMap对应关系时的区别
  • Java深入 - 深入理解Java集合
  • Making An Indicator With Pure CSS
  • OSS Web直传 (文件图片)
  • SegmentFault 社区上线小程序开发频道,助力小程序开发者生态
  • Spring Cloud(3) - 服务治理: Spring Cloud Eureka
  • 分布式事物理论与实践
  • 前端路由实现-history
  • 算法之不定期更新(一)(2018-04-12)
  • 想写好前端,先练好内功
  • 这几个编码小技巧将令你 PHP 代码更加简洁
  • ​ ​Redis(五)主从复制:主从模式介绍、配置、拓扑(一主一从结构、一主多从结构、树形主从结构)、原理(复制过程、​​​​​​​数据同步psync)、总结
  • ​linux启动进程的方式
  • # .NET Framework中使用命名管道进行进程间通信
  • #经典论文 异质山坡的物理模型 2 有效导水率
  • #微信小程序(布局、渲染层基础知识)
  • #我与Java虚拟机的故事#连载15:完整阅读的第一本技术书籍
  • ${factoryList }后面有空格不影响
  • (附源码)ssm基于jsp的在线点餐系统 毕业设计 111016
  • (剑指Offer)面试题41:和为s的连续正数序列
  • (经验分享)作为一名普通本科计算机专业学生,我大学四年到底走了多少弯路
  • (一)Java算法:二分查找
  • (一)插入排序
  • (一)使用Mybatis实现在student数据库中插入一个学生信息
  • (一)硬件制作--从零开始自制linux掌上电脑(F1C200S) <嵌入式项目>
  • (原創) 如何解决make kernel时『clock skew detected』的warning? (OS) (Linux)
  • (转)h264中avc和flv数据的解析
  • (转)如何上传第三方jar包至Maven私服让maven项目可以使用第三方jar包
  • (转)四层和七层负载均衡的区别
  • **PyTorch月学习计划 - 第一周;第6-7天: 自动梯度(Autograd)**
  • *ST京蓝入股力合节能 着力绿色智慧城市服务
  • .NET 5种线程安全集合
  • .NET 6 在已知拓扑路径的情况下使用 Dijkstra,A*算法搜索最短路径
  • .NET 服务 ServiceController
  • .NetCore实践篇:分布式监控Zipkin持久化之殇