JAVA-集合

36 阅读3分钟

1. List 系列

ArrayList

  • 特点: 基于动态数组实现,随机访问快,尾部添加元素快

  • 优点: 查询效率高(O(1)),使用简单直观

  • 缺点: 插入删除操作慢(O(n)),需要移动元素,线程不安全

  • 使用场景: 频繁查询,很少增删的场景

LinkedList

  • 特点: 基于双向链表实现

  • 优点: 插入删除效率高(O(1)),尤其是首尾操作

  • 缺点: 随机访问慢(O(n)),内存占用较大

  • 使用场景: 频繁增删操作,如队列实现

Vector

  • 特点: 类似ArrayList但线程安全

  • 优点: 多线程环境下安全

  • 缺点: 性能较差,现已较少使用

  • 使用场景: 对线程安全有要求且不追求高性能的场景

2. Set 系列

HashSet

  • 特点: 基于HashMap实现,无序不重复

  • 优点: 添加、删除、查找的效率都是O(1)

  • 缺点: 无序,不能保证元素顺序

  • 使用场景: 去重,不关心顺序的场景

LinkedHashSet

  • 特点: 基于LinkedHashMap实现,有序不重复

  • 优点: 维护元素插入顺序,查询性能好

  • 缺点: 比HashSet消耗更多内存

  • 使用场景: 既要去重又要保持插入顺序

TreeSet

  • 特点: 基于红黑树实现,有序不重复

  • 优点: 自动排序,范围查询效率高

  • 缺点: 增删改查效率较低(O(logn))

  • 使用场景: 需要自然排序或自定义排序的场景

3. Map 系列

HashMap

  • 特点: 基于哈希表实现,键值对存储

  • 优点: 增删改查效率高(O(1))

  • 缺点: 无序,非线程安全

  • 使用场景: 高性能的键值存储

LinkedHashMap

  • 特点: 在HashMap基础上维护了元素的插入顺序

  • 优点: 既有HashMap的高效也能保持顺序

  • 缺点: 比HashMap消耗更多内存

  • 使用场景: 需要记住键值对插入顺序的场景

TreeMap

  • 特点: 基于红黑树实现,键值对有序存储

  • 优点: 按键自动排序,支持范围操作

  • 缺点: 性能略低于HashMap(O(logn))

  • 使用场景: 需要按键排序的场景

Hashtable

  • 特点: 类似HashMap但线程安全

  • 优点: 多线程环境安全

  • 缺点: 性能较差

  • 使用场景: 已基本被ConcurrentHashMap替代

ConcurrentHashMap

  • 特点: 线程安全的HashMap,分段锁设计

  • 优点: 高并发性能好,线程安全

  • 缺点: 复杂度高,略低于HashMap

  • 使用场景: 高并发环境下的Map应用

遍历方式比较

Iterator 迭代器

  • 优点:

  • 标准遍历方式,适用所有集合

  • 可以在遍历过程中安全地删除元素

  • 提供了更细粒度的控制

  • 缺点:

  • 代码相对冗长

  • 性能略低于直接索引访问

  • 使用场景:

  • 需要在遍历时删除元素

  • 需要更多控制的场景

foreach (增强for循环)

底层使用的依旧是iterator

  • 优点:

  • 语法简洁优雅

  • 代码可读性好

  • 避免索引越界问题

  • 缺点:

  • 不能获取索引位置

  • 不能在遍历时修改集合(会抛出ConcurrentModificationException)

  • 对于基本类型的数组会有装箱操作

  • 使用场景:

  • 简单遍历且不需要修改集合

  • 追求代码简洁性的场景