目录
-
List 接口
- ArrayList 和 LinkedList 的区别:ArrayList 基于动态数组实现,随机访问效率高,即通过索引获取元素的速度快,时间复杂度为 O (1)。但在进行插入和删除操作时,尤其是在列表中间位置操作,需要移动大量元素,效率较低,时间复杂度为 O (n) 。LinkedList 基于双向链表实现,插入和删除操作只需修改指针,效率较高,时间复杂度为 O (1) 。但随机访问时需要从头或尾开始遍历链表,效率低,时间复杂度为 O (n)。此外,ArrayList 内存占用相对紧凑,LinkedList 每个节点需要额外存储前后节点的引用,内存开销更大。
- Vector 与 ArrayList 对比:Vector 是线程安全的,它的方法大多使用
synchronized关键字修饰,这使得在多线程环境下可以安全使用,但也带来了性能开销。而 ArrayList 是非线程安全的,在单线程环境或使用外部同步机制保证线程安全的情况下,ArrayList 性能更好,因为它没有同步带来的额外开销。
-
Set 接口
- HashSet 的工作原理:HashSet 基于 HashMap 实现,内部使用 HashMap 来存储元素。当向 HashSet 中添加元素时,首先会调用元素的
hashCode()方法计算哈希值,根据哈希值找到对应的哈希桶(bucket),然后在桶内通过equals()方法判断元素是否已经存在。如果哈希值不同,直接存储;如果哈希值相同且equals()方法返回true,则视为重复元素,不进行存储。 - TreeSet 的特性:TreeSet 基于红黑树实现,元素会按照自然顺序(实现
Comparable接口的顺序)或自定义顺序(通过构造函数传入Comparator)进行排序。这使得 TreeSet 适用于需要对元素进行排序的场景,例如需要对一组整数从小到大排序存储。在查找元素时,TreeSet 的时间复杂度为 O (log n),因为红黑树的高度是对数级别的。
- HashSet 的工作原理:HashSet 基于 HashMap 实现,内部使用 HashMap 来存储元素。当向 HashSet 中添加元素时,首先会调用元素的
-
Map 接口
- HashMap 的工作原理与线程安全性:HashMap 基于哈希表实现,通过
hashCode()和equals()方法来确定元素的存储位置和唯一性。在 JDK 1.8 之前,HashMap 由数组和链表组成,当发生哈希冲突时,会将冲突的元素以链表形式存储在数组的同一位置。JDK 1.8 引入了红黑树,当链表长度达到阈值(默认为 8)且数组长度达到 64 时,链表会转换为红黑树,以提高查找效率。HashMap 是非线程安全的,在多线程环境下可能会出现数据不一致的问题,例如在扩容时可能会形成环形链表导致死循环。 -
ConcurrentHashMap 在多线程环境下的优势:ConcurrentHashMap 在 JDK 1.7 中采用分段锁技术,将数据分成多个段(Segment),每个段有独立的锁,不同段的操作可以并发进行,大大提高了并发性能。在 JDK 1.8 中,放弃了分段锁,采用 CAS操作和
synchronized关键字相结合的方式,进一步提高了并发度。它允许多个线程同时读,部分线程写,保证了线程安全的同时,减少了锁的竞争,提升了性能。
- HashMap 的工作原理与线程安全性:HashMap 基于哈希表实现,通过

被折叠的 条评论
为什么被折叠?



