
一、前置基础1. 关系梳理Map键值对存储key-valuekey 唯一value 可重复实现类HashMap主流、TreeMap、LinkedHashMapSet元素不可重复集合底层绝大多数基于 Map 实现HashSet底层HashMap存元素做 key固定占位 Object 做 valueLinkedHashSetLinkedHashMap有序TreeSetTreeMap自动排序2. 核心特性 HashMap键唯一允许 key/value 为 null最多 1 个 null key无序不保证存入顺序LinkedHashMap保证插入顺序底层数组 链表 红黑树负载因子 0.75扩容 2 倍线程不安全多线程用ConcurrentHashMap3. 核心特性 HashSet元素不可重复允许一个 null 元素无序底层完全复用 HashMap仅封装 key 操作无索引不能通过下标遍历第一部分HashMap 全部常用方法详解1. 构造方法4 种java// 1. 默认构造容量16负载因子0.75 HashMapK,V map new HashMap(); // 2. 指定初始容量 HashMapString,Integer map new HashMap(32); // 3. 指定容量 负载因子 HashMapString,Integer map new HashMap(32, 0.6f); // 4. 传入已有Map复制 HashMapString,Integer map new HashMap(oldMap);2. 增 / 改操作put(K key, V value)功能存入键值对key 存在则覆盖旧 value返回旧值不存在返回 nulljavaHashMapString, Integer map new HashMap(); Integer old map.put(张三, 18); System.out.println(old); // null old map.put(张三, 20); System.out.println(old); // 18 被覆盖putIfAbsent(K key, V value)仅 key 不存在时才存入存在不覆盖返回原有值 适合不存在才新增避免覆盖javamap.putIfAbsent(李四, 22); map.putIfAbsent(张三, 99); // 张三已存在不修改putAll(Map? extends K, ? extends V m)批量合并另一个 map重复 key 同样覆盖javaHashMapString,Integer temp new HashMap(); temp.put(王五,30); map.putAll(temp);3. 查询操作get(Object key)根据 key 取值无 key 返回 nulljavaInteger age map.get(张三);getOrDefault(Object key, V defaultValue)key 不存在返回默认值避免空指针高频推荐java// 没有赵六则返回0 int age map.getOrDefault(赵六, 0);containsKey(Object key)判断是否存在指定 key返回 booleanjavaif(map.containsKey(张三)){ System.out.println(存在该键); }containsValue(Object value)判断是否存在指定 value遍历整张表效率低javamap.containsValue(18);4. 删除操作remove(Object key)根据 key 删除返回被删除的 value无 key 返回 nulljavaInteger delVal map.remove(张三);remove(Object key, Object value)键值匹配才删除匹配成功返回 true否则 falsejava// 只有张三对应值是20才删除 map.remove(张三,20);5. 替换更新replace(K key, V newValue)key 存在才替换 value返回旧值不存在不操作javamap.replace(李四, 25);replace(K key, V oldValue, V newValue)键 旧值同时匹配才替换javamap.replace(李四,25,26);replaceAll(BiFunction)批量替换所有 value基于原有键值计算新值java// 所有数字1 map.replaceAll((k,v) - v 1);6. 大小、判空、清空size()返回键值对总数量javaint size map.size();isEmpty()判断 map 是否为空size0 返回 truejavamap.isEmpty();clear()清空所有键值对容量不变javamap.clear();7. 获取视图集合遍历必备keySet ()获取所有 key 集合 SetKjavaSetString keys map.keySet(); for(String key : keys){ System.out.println(key map.get(key)); }values ()获取所有 value 集合 CollectionVjavaCollectionInteger values map.values(); for(Integer v : values){ System.out.println(v); }entrySet ()获取键值对实体 SetMap.EntryK,V最高效遍历javaSetMap.EntryString,Integer entries map.entrySet(); for(Map.EntryString,Integer entry : entries){ String k entry.getKey(); Integer v entry.getValue(); }8. 遍历专用函数式方法forEach(BiConsumer)javamap.forEach((k,v) - { System.out.println(k : v); });9. 计算缓存方法Java8 高频computeIfAbsent(K key, Function)key 不存在执行函数生成 value 存入并返回存在直接返回 value 典型场景Map 嵌套集合java// key不存在新建ArrayList存在直接返回list map.computeIfAbsent(学生列表, k - new ArrayList()).add(小明);computeIfPresent(K key, BiFunction)key 存在才执行函数更新 valuejavamap.computeIfPresent(张三, (k,v) - v 1);compute(K key, BiFunction)无论 key 是否存在都执行函数更新 / 新增javamap.compute(张三, (k,v) - v null ? 1 : v1);merge(K key, V value, BiFunction)合并 value不存在则存入存在执行函数合并新旧值java// 相同key数字累加 map.merge(计数, 1, Integer::sum);10. 克隆 相等判断clone()浅拷贝返回新 HashMapjavaHashMapString,Integer newMap (HashMap) map.clone();equals(Object o)键值对完全相同返回 true判断地址equals判断内容hashCode()返回哈希值HashMap 重写用于比较两个 map 是否相等第二部分HashSet 全套方法详解底层private transient HashMapE,Object map;存入元素作为 key统一常量PRESENT new Object()作为 value 占位。1. 构造方法java// 空集合 HashSetString set new HashSet(); // 指定初始容量 HashSetString set new HashSet(16); // 容量负载因子 HashSetString set new HashSet(16,0.75f); // 传入集合初始化 ListString list Arrays.asList(a,b); HashSetString set new HashSet(list);2. 新增 add (E e)添加元素返回 booleantrue元素不存在添加成功false元素已存在重复不存入javaset.add(苹果); set.add(苹果); // 返回false去重3. 查询判断contains(Object o)集合是否包含该元素javif(set.contains(苹果)){}size()元素个数isEmpty()是否无元素4. 删除remove(Object o)删除元素存在返回 true否则 falsejavaset.remove(苹果);clear()清空全部元素removeIf (Predicate) Java8 批量条件删除java// 删除长度大于3的字符串 set.removeIf(s - s.length() 3);5. 集合转换、批量操作addAll(Collection? extends E c)批量添加集合所有元素自动去重javaListString list Arrays.asList(香蕉,橘子); set.addAll(list);containsAll(Collection? c)是否包含传入集合全部元素javaset.containsAll(Arrays.asList(苹果,香蕉));retainAll(Collection? c)取交集只保留两边都存在的元素javaset.retainAll(Arrays.asList(苹果,橘子));removeAll(Collection? c)删除传入集合中所有匹配元素javaset.removeAll(Arrays.asList(香蕉));6. 遍历相关iterator () 获取迭代器javaIteratorString it set.iterator(); while(it.hasNext()){ System.out.println(it.next()); }forEach (Consumer) 函数式遍历javaset.forEach(s - System.out.println(s));toArray () 转数组javaObject[] arr set.toArray(); String[] strArr set.toArray(new String[0]);7. 克隆、相等clone () 浅拷贝javaHashSetString newSet (HashSet) set.clone();equals()、hashCode()重写方法比较集合内元素是否完全一致8. 补充Set 通用特性相关方法无法使用的操作Set 无下标、无 get (int index)不能通过索引取值 无替换元素方法只能先 remove 再 add。遍历三种方式增强 for 循环javafor(String s : set){}Iterator 迭代器支持遍历中删除forEach 函数式三、HashMap vs HashSet 核心对比存储结构HashMapkey-value 键值对HashSet单个元素底层 HashMap元素作为 key唯一性约束HashMapkey 唯一value 可重复HashSet所有元素唯一常用场景HashMap缓存、映射关系、存储对象属性HashSet去重、判断元素是否存在、交集差集运算获取元素HashMap通过 key 直接取值 O (1)HashSet无 key只能遍历 / 判断是否存在四、高频开发代码示例汇总1. HashMap 遍历三种方式javaHashMapString,Integer map new HashMap(); map.put(a,1); map.put(b,2); // 1. entrySet 最优 for(Map.EntryString,Integer entry : map.entrySet()){ System.out.println(entry.getKey() entry.getValue()); } // 2. keySet for(String k : map.keySet()){ System.out.println(k map.get(k)); } // 3. forEach map.forEach((k,v)- System.out.println(k));2. HashSet 快速去重javaListInteger list Arrays.asList(1,2,2,3,3,3); HashSetInteger set new HashSet(list); // 自动去除重复数字3. HashMap 分组computeIfAbsent 经典场景javaHashMapString, ListInteger groupMap new HashMap(); // 把相同key的数据存入同一个list groupMap.computeIfAbsent(一班, k - new ArrayList()).add(90); groupMap.computeIfAbsent(一班, k - new ArrayList()).add(88);4. 合并 value 计数 mergejavaHashMapString, Integer countMap new HashMap(); countMap.merge(订单, 1, Integer::sum); countMap.merge(订单, 1, Integer::sum); // 订单对应值为2五、常见坑点总结HashMap key 重写equals()和hashCode()自定义对象不重写会判断重复失效HashSet 存自定义对象同样需要重写equalshashCodeget () 无 key 返回 null优先使用getOrDefault避免空指针多线程下 HashMap 扩容会死循环并发使用 ConcurrentHashMapHashSet 无序需要有序选择 LinkedHashSet需要排序选择 TreeSetentrySet 遍历效率远高于 keySetget大数据量优先使用 entrySetremove (key,value) 必须键值同时匹配才删除只传 key 直接删除该键。