特点
Set 集合有什么特点?如何实现 key 无重复的?
Set 集合核心特点
无序性:不保证存储顺序(如 HashSet),部分实现(如 LinkedHashSet)通过链表维护插入顺序
唯一性:元素必须唯一,重复元素自动过滤
允许 null 值:多数实现(如 HashSet)允许一个 null,ConcurrentHashSet 等线程安全实现禁止 null
动态扩容:无固定大小限制,底层通过哈希表或平衡树管理容量
实现 key 无重复的机制
哈希表与 hashCode():
添加元素时计算
hashCode()
,哈希函数定位存储位置哈希位置为空则存储;冲突时触发链表/红黑树处理
equals() 精确判重:
哈希冲突时调用
equals()
判断元素是否相同,相同则拒绝添加自定义类需重写
hashCode()
和equals()
,否则基于内存地址判重
不同实现类特性对比
HashSet:基于哈希表,查询 O(1),无序,允许 null
LinkedHashSet:维护插入顺序链表,适合需保留顺序的场景
TreeSet:基于红黑树,元素按自然顺序或比较器排序,查询 O(log n)
ConcurrentHashSet:线程安全(如包装 ConcurrentHashMap),禁止 null
应用场景
去重操作:快速过滤重复元素(如日志去重)
集合运算:高效计算交集、并集、差集(如权限比对)
缓存唯一数据:存储唯一标识符或配置项(如用户 ID 缓存)
有序
有序的 Set 是什么?记录插入顺序的集合是什么?
有序的 Set 实现
LinkedHashSet
基于哈希表 + 双向链表,维护元素插入顺序
迭代顺序与添加顺序一致,适合需要保留插入顺序的去重场景(如操作日志记录)
TreeSet
基于红黑树,元素按自然顺序(如数值大小)或自定义比较器排序
适合需要排序查询的场景(如排行榜)
记录插入顺序的集合
LinkedHashSet:唯一支持记录插入顺序的 Set,通过链表维护顺序,哈希表保证唯一性
对比其他结构:
List(如 ArrayList):记录顺序但允许重复,不属于 Set
LinkedHashMap:记录键的插入顺序,但存储键值对而非单一元素
选择建议
保留插入顺序:使用 LinkedHashSet(如按步骤记录唯一事件)
自定义排序:使用 TreeSet(如按价格排序商品)
性能考量:
LinkedHashSet:查询/插入 O(1),内存开销略高于 HashSet
TreeSet:增删查 O(log n),适合大数据量排序场景
Java 实现 LRU
最简单的就是使用 LinkedHashMap 实现 LRU
评论区