基本概念:
HashMap 是一个散列表,它存储的内容是键值对(key-value)映射。
HashMap 是无序的,即不会记录插入的顺序。
HashMap 继承于AbstractMap,实现了 Map、Cloneable、java.io.Serializable 接口。
HashMap 实现了 Map 接口,根据键的 HashCode 值存储数据,具有很快的访问速度,最多允许一条记录的键为 null,不支持线程同步。
PS:如果需要在多线程环境中使用 HashMap,并保证线程安全,可以使用 java.util.concurrent.ConcurrentHashMap
类。ConcurrentHashMap 是 Java 提供的一个线程安全的哈希表实现,它可以替代 HashMap 在并发环境中的使用。
HashMap 的 key 与 value 类型可以相同也可以不同,可以是字符串(String)类型的 key 和 value,也可以是整型(Integer)的 key 和字符串(String)类型的 value。
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-k7axV6X4-1691391012852)(https://static.runoob.com/images/mix/java-map.svg)]
HashMap 中的元素实际上是对象,一些常见的基本类型可以使用它的包装类。
基本类型对应的包装类表如下:
基本类型 | 引用类型 |
---|---|
boolean | Boolean |
byte | Byte |
short | Short |
int | Integer |
long | Long |
float | Float |
double | Double |
char | Character |
HashMap 类位于 java.util 包中,使用前需要引入它,语法格式如下:
import java.util.HashMap; // 引入 HashMap 类
以下实例我们创建一个 HashMap 对象 FritsSites, 整型(Integer)的 key 和字符串(String)类型的 value:
HashMap<Integer, String> FruitsSites = new HashMap<Integer, String>();
小结一下HashMap 的基本概念如下:
- 键(Key):每个键必须是唯一的。键用于查找和访问与之关联的值。在 HashMap 中,键可以是任意对象,但通常使用不可变(immutable)的对象作为键,例如字符串、数字等。
- 值(Value):与每个键关联的值。值可以是任意对象,包括 null。
- 哈希表(Hash Table):HashMap 内部使用哈希表数据结构来存储键值对。哈希表通过将键映射为数组索引来实现高效的检索操作。
- 哈希码(Hash Code):每个键都有一个对应的哈希码,用于确定键在哈希表中的位置。hashCode() 方法用于计算键的哈希码。
- 冲突(Collision):当不同的键具有相同的哈希码时,称为冲突。HashMap 使用链表或红黑树来解决冲突,以确保键值对能正确存储和检索。
HashMap的特点如下:
- 高效的插入、删除和查找操作:由于使用了哈希表,HashMap 提供了接近常数时间复杂度的性能。
- 无序的键值对:HashMap 不保证键值对的顺序,因为它是基于哈希表实现的。
- 允许 null 键和 null 值:HashMap 中可以存储 null 键和 null 值。
- 非线程安全:HashMap 不是线程安全的,如果多个线程同时访问同一个 HashMap 并进行修改,可能会导致不确定的结果。如果需要在多线程环境中使用,可以考虑使用 ConcurrentHashMap。
下面是具体的例子:
import java.util.HashMap;
import java.util.Map;
public class HashMapExample {
public static void main(String[] args) {
Map<String, Integer> fruitQuantityMap = new HashMap<>();
// 添加键值对
fruitQuantityMap.put("Apple", 10);
fruitQuantityMap.put("Banana", 5);
fruitQuantityMap.put("Orange", 8);
System.out.println("HashMap 初始内容: " + fruitQuantityMap);
// 修改键为 "Banana" 的值为 6
fruitQuantityMap.put("Banana", 6);
System.out.println("修改后的 HashMap: " + fruitQuantityMap);
// 删除键为 "Orange" 的键值对
fruitQuantityMap.remove("Orange");
System.out.println("删除键为 \"Orange\" 后的 HashMap: " + fruitQuantityMap);
// 获取键为 "Apple" 的值
int appleValue = fruitQuantityMap.get("Apple");
System.out.println("键为 \"Apple\" 的值为: " + appleValue);
// 遍历 HashMap
System.out.println("遍历 HashMap:");
for (Map.Entry<String, Integer> entry : fruitQuantityMap.entrySet()) {
String fruit = entry.getKey();
int quantity = entry.getValue();
System.out.println(fruit + ": " + quantity);
}
}
}
输出结果如下:
Copy CodeHashMap 初始内容: {Apple=10, Orange=8, Banana=5}
修改后的 HashMap: {Apple=10, Orange=8, Banana=6}
删除键为 "Orange" 后的 HashMap: {Apple=10, Banana=6}
键为 "Apple" 的值为: 10
遍历 HashMap:
Apple: 10
Banana: 6
运行程序后,会输出初始的 fruitQuantityMap
的内容,然后按顺序进行修改、删除和获取操作,并显示相应的结果。最后,通过遍历 fruitQuantityMap
,打印出所有水果及其对应的数量。
HashMap常用的方法有:
常用方法列表如下:
方法 | 描述 |
---|---|
clear() | 删除 hashMap 中的所有键/值对 |
clone() | 复制一份 hashMap |
isEmpty() | 判断 hashMap 是否为空 |
size() | 计算 hashMap 中键/值对的数量 |
put() | 将键/值对添加到 hashMap 中 |
putAll() | 将所有键/值对添加到 hashMap 中 |
putIfAbsent() | 如果 hashMap 中不存在指定的键,则将指定的键/值对插入到 hashMap 中。 |
remove() | 删除 hashMap 中指定键 key 的映射关系 |
containsKey() | 检查 hashMap 中是否存在指定的 key 对应的映射关系。 |
containsValue() | 检查 hashMap 中是否存在指定的 value 对应的映射关系。 |
replace() | 替换 hashMap 中是指定的 key 对应的 value。 |
replaceAll() | 将 hashMap 中的所有映射关系替换成给定的函数所执行的结果。 |
get() | 获取指定 key 对应对 value |
getOrDefault() | 获取指定 key 对应对 value,如果找不到 key ,则返回设置的默认值 |
forEach() | 对 hashMap 中的每个映射执行指定的操作。 |
entrySet() | 返回 hashMap 中所有映射项的集合集合视图。 |
keySet() | 返回 hashMap 中所有 key 组成的集合视图。 |
values() | 返回 hashMap 中存在的所有 value 值。 |
merge() | 添加键值对到 hashMap 中 |
compute() | 对 hashMap 中指定 key 的值进行重新计算 |
computeIfAbsent() | 对 hashMap 中指定 key 的值进行重新计算,如果不存在这个 key,则添加到 hasMap 中 |
computeIfPresent() | 对 hashMap 中指定 key 的值进行重新计算,前提是该 key 存在于 hashMap 中。 |
更多 API 方法可以查看:https://www.runoob.com/manual/jdk11api/java.base/java/util/HashMap.html
结尾语:记录于2023年8月7号14时48分,以上仅为个人在[Java数据结构HashMap—Java高级编程—菜鸟教程](Java HashMap | 菜鸟教程 (runoob.com))的学习过程中遇到的问题,还有记录的个人想法,有错误欢迎指出,希望对您有帮助,感谢观看!如果可以的话,点点赞,点点关注