java 中 HashMap 简单介绍及使用

163 阅读2分钟

HashMap 是 Java 中常用的一种哈希表,它提供了快速的插入和查询操作。下面是详细的介绍:

HashMap 的原理:

HashMap 是基于哈希表实现的,每个键值对都会被映射到一个数组索引上,这个索引上存储着该键值对的引用。当我们要查找某个键对应的值时,HashMap 会根据键的哈希码计算出对应的索引,并在该索引处查找键值对。如果该索引处有多个键值对,则通过链表或红黑树等数据结构进行存储。

HashMap 的时间复杂度:

HashMap 的插入、删除、查找操作的时间复杂度均为 O(1),即常数级别的时间复杂度。但是,在最坏情况下,所有的键都被映射到了同一个索引上,此时的操作时间复杂度就会退化为 O(n)。

HashMap 的注意事项:

在使用 HashMap 时,需要注意以下几点:

  1. 键必须实现 hashCode() 和 equals() 方法。hashCode() 方法用于计算键的哈希码,equals() 方法用于判断两个键是否相等。

  2. HashMap 不是线程安全的,如果多个线程同时访问同一个 HashMap 对象并且其中至少有一个线程修改了该对象,则必须使用同步机制来保证线程安全。

  3. HashMap 的初始容量和负载因子可以通过构造函数指定,如果不指定,则使用默认值 16 和 0.75。当哈希表中键值对数量达到了容量与负载因子的乘积时,就会触发扩容操作,这会导致哈希表中所有的键值对被重新分配到新的索引上。

  4. 在遍历 HashMap 时,建议使用 entrySet() 方法返回一个包含所有键值对的 Set 集合,进行迭代操作,而不是使用 keySet() 方法返回所有键的集合,然后再通过键获取对应的值,因为后者需要进行两次哈希计算,效率较低。

下面是一个使用 HashMap 的示例代码:

import java.util.HashMap;

public class HashMapDemo {
    public static void main(String[] args) {
        HashMap<String, Integer> map = new HashMap<>();
        map.put("Alice", 20);
        map.put("Bob", 25);
        map.put("Charlie", 30);

        System.out.println(map.get("Bob")); // 输出:25
        System.out.println(map.containsKey("David")); // 输出:false

        for (String key : map.keySet()) {
            System.out.println(key + ": " + map.get(key));
        }
    }
}

在这个示例中,我们创建了一个 HashMap 对象,并向其中添加了三个键值对。然后我们使用 get() 方法取出了 Bob 对应的值,使用 containsKey() 方法检查了是否包含 David 这个键,使用 keySet() 方法遍历了所有的键。