后端场景面试题, Java 集合
后端场景面试题, Java 集合
QA
Step 1
Q:: 解释Java中的HashMap与Hashtable的区别?
A:: HashMap和Hashtable都是用来存储键值对的集合类。主要区别在于:1) HashMap是非同步的,不是线程安全的,Hashtable是同步的,是线程安全的。2) HashMap允许一个null键和多个null值,Hashtable不允许null键和null值。3) HashMap性能更好,因为它没有额外的同步开销。4) HashMap是Java 1.2引入的,Hashtable则是Java 1.0
就存在的老旧类。
Step 2
Q:: ArrayList和LinkedList的区别是什么?
A:: ArrayList和LinkedList都实现了List接口,但其底层实现不同。1) ArrayList基于动态数组,LinkedList基于双向链表。2) ArrayList访问元素的时间复杂度为O(1),LinkedList为O(n)。3) 在频繁插入和删除操作的场景中,LinkedList表现更好,因为它不需要像ArrayList那样移动元素。4)
LinkedList比ArrayList更消耗内存,因为它每个节点都存储了指向前一个和后一个元素的引用。
Step 3
Q:: 什么是Java中的ConcurrentHashMap?它如何保证线程安全?
A:: ConcurrentHashMap是Java中线程安全的Map实现。与Hashtable不同,它不使用全局同步,而是将Map分成多个Segment(默认16
个),每个Segment独立同步,从而允许更高的并发度。读操作是无锁的,写操作只锁定一个Segment,极大提高了并发性能。
Step 4
Q:: 解释Java中的Fail-fast和Fail-
safe机制?
A:: Fail-fast机制是指在遍历集合时,如果发现集合被结构性修改(如增加或删除元素),将抛出ConcurrentModificationException。Fail-
safe机制则是在遍历时不会抛出异常,因为它们通常是遍历副本或使用特殊的集合类(如ConcurrentHashMap)实现的。
Step 5
Q:: 如何选择ArrayList、LinkedList和Vector?
A:: 1) 如果需要频繁的随机访问,ArrayList是首选,因为它支持快速的基于索引的访问。2) 如果需要频繁的插入和删除操作,LinkedList表现更好。3)
如果需要线程安全且不在乎性能,Vector是一个选择,但通常不推荐使用Vector,而是推荐使用更现代的线程安全集合如ConcurrentHashMap或CopyOnWriteArrayList。