Java集合:List、Set、Map

目录

List 接口

Set 接口

Map 接口


 

  1. List 接口

    • ArrayList 和 LinkedList 的区别:ArrayList 基于动态数组实现,随机访问效率高,即通过索引获取元素的速度快,时间复杂度为 O (1)。但在进行插入和删除操作时,尤其是在列表中间位置操作,需要移动大量元素,效率较低,时间复杂度为 O (n) 。LinkedList 基于双向链表实现,插入和删除操作只需修改指针,效率较高,时间复杂度为 O (1) 。但随机访问时需要从头或尾开始遍历链表,效率低,时间复杂度为 O (n)。此外,ArrayList 内存占用相对紧凑,LinkedList 每个节点需要额外存储前后节点的引用,内存开销更大。
    • Vector 与 ArrayList 对比:Vector 是线程安全的,它的方法大多使用synchronized关键字修饰,这使得在多线程环境下可以安全使用,但也带来了性能开销。而 ArrayList 是非线程安全的,在单线程环境或使用外部同步机制保证线程安全的情况下,ArrayList 性能更好,因为它没有同步带来的额外开销。
  2. Set 接口

    • HashSet 的工作原理:HashSet 基于 HashMap 实现,内部使用 HashMap 来存储元素。当向 HashSet 中添加元素时,首先会调用元素的hashCode()方法计算哈希值,根据哈希值找到对应的哈希桶(bucket),然后在桶内通过equals()方法判断元素是否已经存在。如果哈希值不同,直接存储;如果哈希值相同且equals()方法返回true,则视为重复元素,不进行存储。
    • TreeSet 的特性:TreeSet 基于红黑树实现,元素会按照自然顺序(实现Comparable接口的顺序)或自定义顺序(通过构造函数传入Comparator)进行排序。这使得 TreeSet 适用于需要对元素进行排序的场景,例如需要对一组整数从小到大排序存储。在查找元素时,TreeSet 的时间复杂度为 O (log n),因为红黑树的高度是对数级别的。
  3. 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关键字相结合的方式,进一步提高了并发度。它允许多个线程同时读,部分线程写,保证了线程安全的同时,减少了锁的竞争,提升了性能。

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值