Java HashMap
HashMap 的键值操作、遍历方式、getOrDefault 与扩容机制。
创建与存取
put(k, v) stores and returns the previous value (or null), get(k) reads and remove(k) deletes. Reusing a key overwrites the value.
import java.util.HashMap;
import java.util.Map;
public class HashMapBasic {
public static void main(String[] args) {
Map<String, Integer> map = new HashMap<>();
System.out.println(map.put("a", 1));
System.out.println(map.put("a", 2));
System.out.println(map.get("a"));
System.out.println(map.get("z"));
System.out.println(map.size());
}
}null
1
2
null
1安全取值
getOrDefault(k, def) removes null checks, containsKey tests presence and putIfAbsent writes only when absent. These three shorten a lot of code.
import java.util.HashMap;
import java.util.Map;
public class HashMapSafe {
public static void main(String[] args) {
Map<String, Integer> map = new HashMap<>();
map.put("a", 1);
System.out.println(map.getOrDefault("a", 0));
System.out.println(map.getOrDefault("b", 0));
System.out.println(map.containsKey("a"));
map.putIfAbsent("a", 99);
map.putIfAbsent("b", 2);
// HashMap 的遍历顺序由哈希桶决定,不能依赖;要断言内容就按键取值
System.out.println(map.size() + " entries: a=" + map.get("a") + ", b=" + map.get("b"));
}
}1
0
true
2 entries: a=1, b=2遍历 HashMap
Three ways to iterate: entrySet() for pairs (most common), keySet() for keys and values() for values. To delete while iterating use an Iterator or removeIf.
HashMap makes no ordering promise — iteration follows the hash buckets. The example uses LinkedHashMap (insertion order) so the output is reproducible; use TreeMap when you need key ordering.import java.util.LinkedHashMap;
import java.util.Map;
import java.util.TreeMap;
public class HashMapIter {
public static void main(String[] args) {
Map<String, Integer> map = new LinkedHashMap<>(); // 保留插入顺序
map.put("b", 2);
map.put("a", 1);
for (Map.Entry<String, Integer> e : map.entrySet()) {
System.out.println(e.getKey() + "=" + e.getValue());
}
System.out.println(new TreeMap<>(map)); // 按 key 排序后输出
System.out.println(map.values()); // 仍是插入顺序
}
}b=2
a=1
{a=1, b=2}
[2, 1]HashMap 方法
put, get, remove, size, isEmpty, containsKey, containsValue, keySet, values, entrySet, merge, compute. Default capacity is 16 with a 0.75 load factor; exceeding it doubles the table.
import java.util.HashMap;
import java.util.Map;
public class HashMapMethods {
public static void main(String[] args) {
Map<String, Integer> map = new HashMap<>();
map.merge("a", 1, Integer::sum);
map.merge("a", 1, Integer::sum);
map.compute("b", (k, v) -> v == null ? 10 : v + 1);
System.out.println(map);
System.out.println(map.containsKey("a"));
System.out.println(map.containsValue(10));
map.remove("a");
System.out.println(map);
}
}{a=2, b=10}
true
true
{b=10}创建与存取
put(k, v) 存入并返回该键的旧值(没有则返回 null),get(k) 取值,remove(k) 删除。键重复会覆盖旧值。
import java.util.HashMap;
import java.util.Map;
public class HashMapBasic {
public static void main(String[] args) {
Map<String, Integer> map = new HashMap<>();
System.out.println(map.put("a", 1));
System.out.println(map.put("a", 2));
System.out.println(map.get("a"));
System.out.println(map.get("z"));
System.out.println(map.size());
}
}null
1
2
null
1安全取值
getOrDefault(k, 默认值) 避免 null 判断,containsKey 判断键存在,putIfAbsent 只在键不存在时写入。这几个方法能让代码短很多。
import java.util.HashMap;
import java.util.Map;
public class HashMapSafe {
public static void main(String[] args) {
Map<String, Integer> map = new HashMap<>();
map.put("a", 1);
System.out.println(map.getOrDefault("a", 0));
System.out.println(map.getOrDefault("b", 0));
System.out.println(map.containsKey("a"));
map.putIfAbsent("a", 99);
map.putIfAbsent("b", 2);
// HashMap 的遍历顺序由哈希桶决定,不能依赖;要断言内容就按键取值
System.out.println(map.size() + " entries: a=" + map.get("a") + ", b=" + map.get("b"));
}
}1
0
true
2 entries: a=1, b=2遍历 HashMap
三种遍历:entrySet() 同时拿键值(最常用)、keySet() 只遍历键、values() 只遍历值。遍历中删除要用 Iterator 或 removeIf。
HashMap 不保证遍历顺序,顺序由哈希桶决定;下面用 LinkedHashMap 演示,它保留插入顺序,输出才可复现。需要按 key 排序时用 TreeMap。import java.util.LinkedHashMap;
import java.util.Map;
import java.util.TreeMap;
public class HashMapIter {
public static void main(String[] args) {
Map<String, Integer> map = new LinkedHashMap<>(); // 保留插入顺序
map.put("b", 2);
map.put("a", 1);
for (Map.Entry<String, Integer> e : map.entrySet()) {
System.out.println(e.getKey() + "=" + e.getValue());
}
System.out.println(new TreeMap<>(map)); // 按 key 排序后输出
System.out.println(map.values()); // 仍是插入顺序
}
}b=2
a=1
{a=1, b=2}
[2, 1]HashMap 方法
put、get、remove、size、isEmpty、containsKey、containsValue、keySet、values、entrySet、merge、compute。默认初始容量 16,负载因子 0.75,超出就扩容一倍。
import java.util.HashMap;
import java.util.Map;
public class HashMapMethods {
public static void main(String[] args) {
Map<String, Integer> map = new HashMap<>();
map.merge("a", 1, Integer::sum);
map.merge("a", 1, Integer::sum);
map.compute("b", (k, v) -> v == null ? 10 : v + 1);
System.out.println(map);
System.out.println(map.containsKey("a"));
System.out.println(map.containsValue(10));
map.remove("a");
System.out.println(map);
}
}{a=2, b=10}
true
true
{b=10}