HashMap 代码示例

130 阅读2分钟

HashMap 是 Java 中的一种集合类,它存储的是键值对(key-value)映射,可通过 key 快速查找 value 其 key 与 value 的类型可以相同也可以不同。它根据键的 HashCode 值存储数据,但不会记录插入的顺序,所以每次遍历的时候都不保证顺序。
通常情况下,HashMap 进行 put 或者 get 操作,可以达到常数时间的性能,所以它是绝大部分利用键值对存取场景的首选。

类图

HashMap-Class.png

添加元素

    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 对象的引用。

HashMap-Structure.png