Java 集合面试题, Java 中的 HashSet 和 HashMap 有什么区别?
Java 集合面试题, Java 中的 HashSet 和 HashMap 有什么区别?
QA
Step 1
Q:: Java 集合框架的主要接口有哪些?
A:: Java 集合框架的主要接口包括:Collection、List、Set、Queue、Deque 和 Map。其中,Collection 是所有集合类的根接口;List 表示一个有序的元素集合;Set 表示一个不包含重复元素的集合;Queue 通常用于实现队列结构;Deque 是双端队列;Map 是一个键值对集合。
Step 2
Q:: Java 中的 HashSet 和 HashMap 有什么区别?
A:: HashSet 是一个不包含重复元素的集合,基于 HashMap 实现。HashMap 是一个键值对集合,每个键对应一个值。主要区别在于:1. HashSet 只存储值,不存储键,内部使用 HashMap 来实现。2. HashMap 存储键值对,键不允许重复,但值可以重复。3.
HashSet 的 add 方法调用的是 HashMap 的 put 方法,并且所有值都存储在 HashMap 的键中,值为一个常量对象。
Step 3
Q:: ArrayList 和 LinkedList 有什么区别?
A:: ArrayList 和 LinkedList 都是 List 接口的实现类,但有以下区别:1. 底层数据结构:ArrayList 基于动态数组实现,而 LinkedList 基于双向链表实现。2. 随机访问:ArrayList 支持高效的随机访问(O(1) 时间复杂度),而 LinkedList 访问元素时需要从头或尾开始遍历(O(n) 时间复杂度)。3. 插入和删除:ArrayList 在中间插入或删除元素时需要移动后续元素(O(n) 时间复杂度),而 LinkedList 仅需修改链表的指针(O(1) 时间复杂度)。4.
内存开销:ArrayList 需要预分配一定的空间,而 LinkedList 由于链表节点的存在会有额外的内存开销。
Step 4
Q:: HashMap 是如何解决哈希冲突的?
A:: HashMap 主要通过链地址法(Separate Chaining)和红黑树(在 Java 8 之后)来解决哈希冲突。当两个不同的键的哈希值相同时,会将这些键值对存储在同一个桶(bucket)中,形成一个链表。在 Java 8 之后,当链表长度超过一定阈值(默认是 8
)时,链表会转换成红黑树,以提高查询效率。
Step 5
Q:: ConcurrentHashMap 如何保证线程安全?
A:: ConcurrentHashMap 通过分段锁(Segment Locking)机制来实现线程安全。在 Java 8 之前,ConcurrentHashMap 将整个 Map 划分为多个段,每个段独立加锁,从而允许多线程并发访问不同段中的数据。在 Java 8
之后,ConcurrentHashMap 引入了更细粒度的锁,并使用 CAS 操作和内置的分段机制(Bin)来提高并发性能和吞吐量。