面试题答案
一键面试ConcurrentHashMap 优缺点
- 优点:
- 高效的并发读写:采用分段锁机制(Java 7 及之前)或 CAS 操作结合 synchronized 锁(Java 8 及之后),允许多个线程同时进行读写操作,在高并发场景下性能较好。
- 线程安全:内部实现保证了线程安全,无需额外的同步措施即可在多线程环境下使用。
- 适合无序数据存储:如果业务对数据顺序没有要求,ConcurrentHashMap 是很好的选择,其插入和查找效率高。
- 缺点:
- 无序性:不保证插入顺序或自然顺序,若业务有顺序要求则不适用。
ConcurrentSkipListMap 优缺点
- 优点:
- 有序性:基于跳表实现,能保证 key 的自然顺序或自定义顺序,适用于需要有序遍历数据的场景。
- 高并发读性能好:跳表的结构使得读操作可以在多个层次上快速定位,读性能较高。
- 扩展性好:随着数据量增加,性能下降相对较平缓。
- 缺点:
- 写性能相对较低:插入和删除操作可能需要调整跳表结构,涉及较多的指针操作,相比 ConcurrentHashMap 写性能略逊一筹。
不同业务需求下的选择
- 有序性要求:
- 需要有序:选择 ConcurrentSkipListMap,因为它能保证 key 的顺序,便于按照顺序遍历数据。例如在统计数据需要按时间顺序展示等场景适用。
- 无需有序:ConcurrentHashMap 更合适,其无序性不影响读写性能,并且在高并发读写方面有优势。比如一般的缓存场景,只关心 key - value 存取,不关心顺序。
- 数据量大小:
- 数据量较小:两者性能差异不明显,可根据是否需要有序选择。如果业务简单且无序需求,ConcurrentHashMap 实现简单;若有有序需求,选 ConcurrentSkipListMap。
- 数据量较大:ConcurrentSkipListMap 的扩展性更好,性能下降相对平缓。而 ConcurrentHashMap 在数据量极大时,若 hash 分布不均匀,可能会影响性能。但总体来说,ConcurrentHashMap 读写性能还是很出色,若无序需求强烈还是可选它。
- 读写比例:
- 读多写少:两者都适合读多场景,但 ConcurrentSkipListMap 读性能也很高且有序;ConcurrentHashMap 性能同样优秀且实现简单,若无顺序需求选它。若有顺序需求只能选 ConcurrentSkipListMap。
- 写多读少:ConcurrentHashMap 写性能更优,因为其锁机制和实现方式在写操作上更高效。例如实时数据更新场景,使用 ConcurrentHashMap 能减少写操作的等待时间。