特点
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 
 
             
           
             
                         
             
            
评论区