📌 目录

  1. 什么是 HashMap?
  2. HashMap 的特性
  3. 创建和初始化 HashMap
  4. HashMap 常用方法
    • 4.1 添加元素
    • 4.2 获取元素
    • 4.3 删除元素
    • 4.4 检查元素
    • 4.5 清空集合
  5. HashMap 性能
  6. HashMap 和 Hashtable、TreeMap 的比较
  7. 总结
  8. 参考资料
  9. 出站链接

1. 什么是 HashMap?

HashMap 是 Java 集合框架中的一个实现类,属于 Map 接口的实现。HashMap 基于哈希表(HashMap 采用的底层是哈希表)实现,存储的是键值对(Key-Value)映射。它可以通过键(Key)快速查找值(Value),并且不保证键值对的顺序。HashMap 不允许键重复,如果往 HashMap 中放入重复的键,后插入的键值对会覆盖之前的键值对。

HashMap 是线程不安全的,在多线程环境下需要手动同步。


2. HashMap 的特性

  • 存储键值对HashMap 存储的是键值对(Key-Value),每个键只能对应一个值,键不能重复。
  • 无序HashMap 中的元素不保证顺序,因此它不维护插入顺序。
  • 允许空键和空值HashMap 允许一个空键(null)和多个空值(null)。
  • 性能高效HashMap 提供了 O(1) 时间复杂度的查找、插入和删除操作,尽管在哈希冲突的情况下,性能可能有所下降。
  • 线程不安全HashMap 是线程不安全的。如果在多线程环境下使用,可能会导致数据不一致,需使用 ConcurrentHashMap 或通过手动同步保证线程安全。

3. 创建和初始化 HashMap

创建空的 HashMap

import java.util.HashMap;

public class HashMapExample {
    public static void main(String[] args) {
        HashMap<String, String> map = new HashMap<>();
        System.out.println("HashMap created: " + map);
    }
}

创建并初始化 HashMap

import java.util.HashMap;
import java.util.Map;

public class HashMapExample {
    public static void main(String[] args) {
        Map<String, String> map = new HashMap<>();
        map.put("Java", "Programming Language");
        map.put("Python", "Programming Language");
        map.put("C++", "Programming Language");

        System.out.println("HashMap initialized: " + map);
    }
}


4. HashMap 常用方法

4.1 添加元素

  • put(K key, V value):将指定的键值对添加到 HashMap 中。如果键已经存在,新的值将会覆盖旧的值。
  • putIfAbsent(K key, V value):只有在键不存在时才将键值对添加到 HashMap 中。
map.put("Java", "Object-Oriented");
map.put("Ruby", "Scripting Language");
map.putIfAbsent("C++", "Compiled Language");

4.2 获取元素

  • get(Object key):返回指定键所映射的值,如果键不存在则返回 null
  • containsKey(Object key):检查 HashMap 中是否包含指定的键。
  • containsValue(Object value):检查 HashMap 中是否包含指定的值。
String value = map.get("Java");  // 获取 "Java" 的值
boolean hasKey = map.containsKey("Python");  // 检查是否包含键 "Python"
boolean hasValue = map.containsValue("Scripting Language");  // 检查是否包含值 "Scripting Language"

4.3 删除元素

  • remove(Object key):删除指定键的键值对,返回被删除的值。
  • remove(Object key, Object value):仅当指定键和指定值都存在时,才删除键值对。
  • clear():删除所有键值对。
map.remove("C++");  // 删除键 "C++"
map.remove("Python", "Programming Language");  // 只有当键值对一致时才删除
map.clear();  // 清空所有键值对

4.4 检查元素

  • size():返回 HashMap 中键值对的数量。
  • isEmpty():检查 HashMap 是否为空。
  • keySet():返回 HashMap 中所有的键。
  • values():返回 HashMap 中所有的值。
  • entrySet():返回 HashMap 中所有的键值对。
int size = map.size();  // 获取大小
boolean isEmpty = map.isEmpty();  // 判断是否为空
System.out.println(map.keySet());  // 获取所有键
System.out.println(map.values());  // 获取所有值
System.out.println(map.entrySet());  // 获取所有键值对

4.5 清空集合

  • clear():清空 HashMap 中的所有键值对。
map.clear();  // 清空所有键值对


5. HashMap 性能

  • 插入操作:插入元素的时间复杂度为 O(1)(平均情况),但如果发生哈希冲突,时间复杂度可能会提高。
  • 查找操作:查找元素的时间复杂度为 O(1)(平均情况)。
  • 删除操作:删除元素的时间复杂度为 O(1)(平均情况)。
  • 空间复杂度HashMap 需要额外的空间来存储哈希表,空间复杂度为 O(n)。

HashMap 的性能高度依赖于哈希函数的质量。如果哈希函数不好,可能会导致哈希冲突,影响性能。因此,选择合适的哈希函数对 HashMap 的性能至关重要。


6. HashMap 和 Hashtable、TreeMap 的比较

特性HashMapHashtableTreeMap
键值对存储顺序无序无序按照键的自然顺序或自定义顺序
线程安全
允许空键
允许空值
性能高效较慢(同步机制影响性能)较慢(排序过程)
  • Hashtable 是线程安全的,但它的性能较差,现代 Java 程序通常推荐使用 HashMapConcurrentHashMap
  • TreeMap 是基于红黑树实现的,能够保持键的顺序(自然顺序或自定义顺序),但性能较慢。

7. 总结

HashMap 是一个高效的键值对存储集合,它提供了快速的查找、插入和删除操作。HashMap 适用于大多数需要键值映射的场景,但在多线程环境下需要小心使用。如果需要线程安全的操作,可以考虑使用 ConcurrentHashMap。与 TreeMapHashtable 相比,HashMap 提供了更高效的性能,特别是在没有排序需求时。


8. 参考资料


9. 出站链接