我们参加Java培训学习都是希望能够毕业后找到满意的工作,然而培训机构只是推荐就业,我们仍然需要进行面试,提高面试技术问答的正确率有助于增加面试官的满意度。本系列全面汇总了企业Java面试的技术问题,希望能够帮助大家。 本文列举的技术问题有:Segment如何实现扩容?1。8版本的数据结构是什么样的?ConcurrentHashMap效率为什么高? 更多Java面试技术问答后续会继续提供,想要一口气获得所有答案的小伙伴可以评论交流哦 问题一:Segment如何实现扩容? A: ConcurrentHashMap的扩容是仅仅和每个Segment元素中HashEntry数组的长度有关,但需要扩容时,只扩容当前Segment中HashEntry数组即可。也就是说ConcurrentHashMap中Segment〔〕数组的长度是在初始化的时候就确定了,后面扩容不会改变这个长度。 问题二:1。8版本的数据结构是什么样的? A: 1。8版本放弃了Segment,跟HashMap一样,用Node描述插入集合中的元素。但是Node中的val和next使用了volatile来修饰,保存了内存可用性。与HashMap相同的是,ConcurrentHashMap1。8版本使用了数组链表红黑树的结构。 同时,ConcurrentHashMap使用了CASSynchronized保证了并发的安全性。下面介绍ConcurrentHashMap的put过程: 问题三:ConcurrentHashMap效率为什么高? A: 因为ConcurrentHashMap的get方法并没有上锁。get时通过hash(key)定位到Segment上,再通过一次Hash定位到具体的HashEntry上。HashEntry的get方法如下: 由于HashEntry的value属性使用了volatile修饰,保证了内存可用性,每次获取都是最新值。因此整个过程不需要加锁。