Java HashMap
- HashMap 特性和创建:
HashMap
是基于哈希表的 Map 实现,以键/值对形式存储元素,可以通过键值或文件对象创建。 - 基本操作:
HashMap
提供方法如put()
添加元素,get()
访问元素,replace()
修改元素,和remove()
删除元素。 - 遍历和其他操作:支持使用 for-each 循环遍历键、值或键/值对,还提供了
clear()
,size()
,isEmpty()
等其他实用方法。
Java 集合框架的 HashMap
类提供了 哈希表数据结构的功能。
它以键/值对的形式存储元素。这里,键是用于将每个值与地图上的对应位置关联的唯一标识符。
HashMap
类实现了 Map 接口。
创建 HashMap
为了创建哈希映射,我们首先必须导入 java.util.HashMap
包。导入包之后,以下是我们在 Java 中创建哈希映射的方式。
// 创建容量为 8 和负载因子为 0.6 的 hashMap
HashMap<K, V> numbers = new HashMap<>();
在上述代码中,我们创建了一个名为 numbers
的哈希映射。这里,K 代表键的类型,V 代表值的类型。例如,
HashMap<String, Integer> numbers = new HashMap<>();
这里,键的类型是 String
,值的类型是 Integer
。
示例 1:在 Java 中创建 HashMap
import java.util.HashMap;
class Main {
public static void main(String[] args) {
// 创建一个 hashmap
HashMap<String, Integer> languages = new HashMap<>();
// 向 hashmap 添加元素
languages.put("Java", 8);
languages.put("JavaScript", 1);
languages.put("Python", 3);
System.out.println("HashMap: " + languages);
}
}
输出
HashMap: {Java=8, JavaScript=1, Python=3}
在上面的示例中,我们创建了一个名为 languages
的 HashMap
。
这里,我们使用了 put()
方法向哈希映射中添加元素。我们 将在本教程后面了解更多关于 put()
方法的信息。
Java HashMap 上的基本操作
HashMap
类提供了各种方法来执行不同的哈希映射操作。在本教程中,我们将查看一些常用的 arrayList 操作:
- 添加元素
- 访问元素
- 更改元素
- 删除元素
1. 向 HashMap 添加元素
要向哈希映射添加单个元素,我们使用 HashMap
类的 put()
方法。例如,
import java.util.HashMap;
class Main {
public static void main(String[] args) {
// 创建一个 hashmap
HashMap<String, Integer> numbers = new HashMap<>();
System.out.println("初始 HashMap: " + numbers);
// 使用 put() 方法添加元素
numbers.put("One", 1);
numbers.put("Two", 2);
numbers.put("Three", 3);
System.out.println("put() 后的 HashMap: " + numbers);
}
}
输出
初始 HashMap: {}
put() 后的 HashMap: {One=1, Two=2, Three=3}
在上面的示例中,我们创建了一个名为 numbers
的 HashMap
。这里,我们使用了 put()
方法向 numbers 添加元素。
注意这个声明,
numbers.put("One", 1);
在这里,我们将 String
类型的值 One
作为键,将 Integer
类型的值 1
作为值传递给 put()
方法。
推荐阅读
2. 访问 HashMap 元素
我们可以使用 get()
方法从 hashmap 中获取值。例如,
import java.util.HashMap;
class Main {
public static void main(String[] args) {
HashMap<Integer, String> languages = new HashMap<>();
languages.put(1, "Java");
languages.put(2, "Python");
languages.put(3, "JavaScript");
System.out.println("HashMap: " + languages);
// 使用 get() 方法获取值
String value = languages.get(1);
System.out.println("索引为 1 的值: " + value);
}
}
输出
HashMap: {1=Java, 2=Python, 3=JavaScript}
索引为 1 的值: Java
在上面的例子中,注意这个表达式,
languages.get(1);
这里,get()
方法以 键 作为参数,并返回与该键关联的相应 值。
我们还可以使用 keySet()
、values()
和 entrySet()
方法分别访问 hashmap 的 键、值 和 键/值 对集合视图。例如,
import java.util.HashMap;
class Main {
public static void main(String[] args) {
HashMap<Integer, String> languages = new HashMap<>();
languages.put(1, "Java");
languages.put(2, "Python");
languages.put(3, "JavaScript");
System.out.println("HashMap: " + languages);
// 返回键的集合视图
// 使用 keySet()
System.out.println("键: " + languages.keySet());
// 返回值的集合视图
// 使用 values()
System.out.println("值: " + languages.values());
// 返回键/值对的集合视图
// 使用 entrySet()
System.out.println("键/值映射: " + languages.entrySet());
}
}
输出
HashMap: {1=Java, 2=Python, 3=JavaScript}
键: [1, 2, 3]
值: [Java, Python, JavaScript]
键/值映射: [1=Java, 2=Python, 3=JavaScript]
在上面的例子中,我们创建了一个名为 languages
的 hashmap。这里,我们正在访问 hashmap 的 键、值 和 键/值 映射。
推荐阅读
- Java HashMap get()
- Java HashMap getOrDefault()
- Java HashMap keySet()
- Java HashMap values()
- Java HashMap entrySet()
3. 更改 HashMap 值
我们可以使用 replace()
方法更改 hashmap 中与键关联的值。例如,
import java.util.HashMap;
class Main {
public static void main(String[] args) {
HashMap<Integer, String> languages = new HashMap<>();
languages.put(1, "Java");
languages.put(2, "Python");
languages.put(3, "JavaScript");
System.out.println("原始 HashMap: " + languages);
// 更改键为 2 的元素
languages.replace(2, "C++");
System.out.println("使用 replace() 的 HashMap: " + languages);
}
}
输出
原始 HashMap: {1=Java, 2=Python, 3=JavaScript}
使用 replace() 的 HashMap: {1=Java, 2=C++, 3=JavaScript}
在上面的例子中,我们创建了一个名为 languages
的 hashmap。注意这个表达式,
languages.replace(2, "C++");
这里,我们正在将键 **2
** 所指的值更改为新值 C++
。
HashMap
类还提供了 replace()
方法的一些变体。要了解更多,请访问
4. 删除 HashMap 元素
要从 hashmap 中删除元素,我们可以使用 remove() 方法。例如,
import java.util.HashMap;
class Main {
public static void main(String[] args) {
HashMap<Integer, String> languages = new HashMap<>();
languages.put(1, "Java");
languages.put(2, "Python");
languages.put(3, "JavaScript");
System.out.println("HashMap: " + languages);
// 删除与键 2 关联的元素
String value = languages.remove(2);
System.out.println("删除的值: " + value);
System.out.println("更新后的 HashMap: " + languages);
}
}
输出
HashMap: {1=Java, 2=Python, 3=JavaScript}
删除的值: Python
更新后的 HashMap: {1=Java, 3=JavaScript}
这里,remove()
方法以 键 为参数。然后它返回与 键 关联的 值 并删除该 条目。
我们还可以只在特定条件下删除条目。例如,
remove(2, "C++");
这里,remove()
方法只在 键 2 与 值 C++ 关联时才删除 条目。由于 2 与 C++ 无关联,因此不删除该条目。
要了解更多,请访问 Java HashMap remove()。
HashMap 的其他方法
方法 | 描述 |
---|---|
clear() | 从 HashMap 中删除所有映射 |
compute() | 为指定键计算新值 |
computeIfAbsent() | 如果键未映射,则计算值 |
computeIfPresent() | 如果键存在,则计算映射值 |
merge() | 将指定映射合并到 HashMap 中 |
clone() | 复制 HashMap |
containsKey() | 检查 Hashmap 中是否存在指定键 |
containsValue() | 检查 Hashmap 是否包含指定值 |
size() | 返回 HashMap 中的项数 |
isEmpty() | 检查 Hashmap 是否为空 |
遍历 HashMap
要遍历 hashmap 的每个条目,我们可以使用 Java for-each 循环。我们可以分别遍历 仅键、仅值 和 键/值映射。例如,
import java.util.HashMap;
import java.util.Map.Entry;
class Main {
public static void main(String[] args) {
// 创建一个 HashMap
HashMap<Integer, String> languages = new HashMap<>();
languages.put(1, "Java");
languages.put(2, "Python");
languages.put(3, "JavaScript");
System.out.println("HashMap: " + languages);
// 仅遍历键
System.out.print("键: ");
for (Integer key : languages.keySet()) {
System.out.print(key);
System.out.print(", ");
}
// 仅遍历值
System.out.print("\n值: ");
for (String value : languages.values()) {
System.out.print(value);
System.out.print(", ");
}
// 遍历键/值条目
System.out.print("\n条目: ");
for (Entry<Integer, String> entry : languages.entrySet()) {
System.out.print(entry);
System.out.print(", ");
}
}
}
输出
HashMap: {1=Java, 2=Python, 3=JavaScript}
键: 1, 2, 3,
值: Java, Python, JavaScript,
条目: 1=Java, 2=Python, 3=JavaScript,
请注意,在上面的示例中我们使用了 Map.Entry
。它是 Map
接口的嵌套类,用于返回映射的视图(元素)。
要使用这个类,我们首先需要导入 java.util.Map.Entry
包。
这个嵌套类返回映射的视图(元素)。
从其他 Map 创建 HashMap
在 Java 中,我们还可以从其他 map 创建 hashmap。例如,
import java.util.HashMap;
import java.util.TreeMap;
class Main {
public static void main(String[] args) {
// 创建一个 TreeMap
TreeMap<String, Integer> evenNumbers = new TreeMap<>();
evenNumbers.put("Two", 2);
evenNumbers.put("Four", 4);
System.out.println("TreeMap: " + evenNumbers);
// 从 TreeMap 创建 HashMap
HashMap<String, Integer> numbers = new HashMap<>(evenNumbers);
numbers.put("Three", 3);
System.out.println("HashMap: " + numbers);
}
}
输出
TreeMap: {Four=4, Two=2}
HashMap: {Two=2, Three=3, Four=4}
在上面的例子中,我们创建了一个名为 evenNumbers
的 TreeMap
。注意这个表达式,
numbers = new HashMap<>(evenNumbers)
这里,我们使用 TreeMap
创建了一个名为 numbers 的 HashMap
。要了解更多关于 treemap 的信息,请访问 Java TreeMap。
注意:在创建 hashmap 时,我们可以包含可选参数:容量 和 加载因子。例如,
HashMap<K, V> numbers = new HashMap<>(8, 0.6f);
这里,
- 8(容量为 8)- 这意味着它可以存储 8 个条目。
- 0.6f(加载因子为 0.6)- 这意味着当我们的哈希表填充到 60% 时,条目会被移到一个新的哈希表中,其大小是原始哈希表的两倍。
如果未使用可选参数,则默认容量将为 16,默认加载因子将为 0.75。