HashMap 是 Java 中的一种集合类,它存储的是键值对(key-value)映射,可通过 key 快速查找 value 其 key 与 value 的类型可以相同也可以不同。它根据键的 HashCode 值存储数据,但不会记录插入的顺序,所以每次遍历的时候都不保证顺序。
通常情况下,HashMap 进行 put 或者 get 操作,可以达到常数时间的性能,所以它是绝大部分利用键值对存取场景的首选。
类图
添加元素
void test_put() {
// 创建 HashMap 对象 stars
HashMap<Integer, String> stars = new HashMap<Integer, String>();
// 添加键值对
stars.put(23, "詹姆斯");
stars.put(77, "东契奇");
stars.put(30, "库里");
System.out.println(stars);
}
访问元素
void test_get() {
// 创建 HashMap 对象 stars
HashMap<Integer, String> stars = new HashMap<Integer, String>();
// 添加键值对
stars.put(23, "詹姆斯");
stars.put(77, "东契奇");
stars.put(30, "库里");
System.out.println(stars.get(77));
}
删除元素
void test_remove() {
// 创建 HashMap 对象 stars
HashMap<Integer, String> stars = new HashMap<Integer, String>();
// 添加键值对
stars.put(23, "詹姆斯");
stars.put(77, "东契奇");
stars.put(30, "库里");
stars.remove(77);
System.out.println(stars);
}
void test_clear() {
// 创建 HashMap 对象 stars
HashMap<Integer, String> stars = new HashMap<Integer, String>();
// 添加键值对
stars.put(23, "詹姆斯");
stars.put(77, "东契奇");
stars.put(30, "库里");
stars.clear();
System.out.println(stars);
}
计算大小
void test_size() {
// 创建 HashMap 对象 stars
HashMap<Integer, String> stars = new HashMap<Integer, String>();
// 添加键值对
stars.put(23, "詹姆斯");
stars.put(77, "东契奇");
stars.put(30, "库里");
System.out.println(stars.size());
}
迭代 HashMap
void test_for() {
// 创建 HashMap 对象 stars
HashMap<Integer, String> stars = new HashMap<Integer, String>();
// 添加键值对
stars.put(23, "詹姆斯");
stars.put(77, "东契奇");
stars.put(30, "库里");
// 遍历 key
for (Integer i : stars.keySet()) {
System.out.println("key: " + i + " value: " + stars.get(i));
}
// 遍历 value
for (String value : stars.values()) {
// 输出没一个 value
System.out.println(value);
}
// 同时遍历 key 和 value
for (Map.Entry<Integer, String> entry : stars.entrySet()) {
System.out.println(entry.getKey() + " = " + entry.getValue());
}
}
containsKey()
containsKey() 方法检查 hashMap 中是否存在指定的 key 对应的映射关系。 如果 hashMap 中存在指定的 key 对应的映射关系返回 true,否则返回 false
void test_containsKey() {
// 创建 HashMap 对象 stars
HashMap<Integer, String> stars = new HashMap<>();
// 添加键值对
stars.put(23, "詹姆斯");
stars.put(77, "东契奇");
stars.put(30, "库里");
System.out.println("sites HashMap: " + stars);
// 检查 key 为 3 是否存在,不存在插入该 key/value 对
// 使用 ! 符号来对布尔结果取相反的值
if (!stars.containsKey(3)) {
stars.put(3, "保罗");
}
System.out.println("Updated sites HashMap: " + stars);
}
isEmpty()
判断 HashMap 是否为空。 如果 HashMap 中不包含任何键/值对的映射关系则返回 true,否则返回 false
void test_isEmpty() {
HashMap<Integer, String> stars = new HashMap<>();
// 检查该 HashMap 是否含有元素
boolean result = stars.isEmpty(); // true
System.out.println("是否为空? " + result);
// 为 HashMap 添加一些元素
stars.put(23, "詹姆斯");
stars.put(77, "东契奇");
stars.put(30, "库里");
System.out.println("HashMap: " + stars);
result = stars.isEmpty(); // false
System.out.println("是否为空? " + result);
}
数据结构
Node 类作为 HashMap 中的一个内部类,除了 key、value 两个属性外,还定义了一个 next 指针。当有哈希冲突时,HashMap 会用之前数组当中相同哈希值对应存储的 Node 对象,通过指针指向新增的相同哈希值的 Node 对象的引用。