{% raw %}

Java HashMap教程

原文:http://zetcode.com/java/hashmap/

Java HashMap教程显示了如何使用 Java HashMap集合。

Java HashMap

HashMap是一个存储键值对的容器。 每个键与一个值关联。 HashMap中的键必须唯一。 HashMap在其他编程语言中称为关联数组或词典。 HashMaps占用更多内存,因为每个值还有一个键。 删除和插入操作需要固定的时间。 HashMaps可以存储空值。

HashMaps不维持秩序。

Map.Entry表示HashMap中的键/值对。 HashMapentrySet()返回包含在映射中的映射的Set视图。 使用keySet()方法检索一组键。

Java HashMap层次结构

HashMap扩展了AbstractMap并实现了MapMap提供了包括get()put()size()isEmpty()的方法签名。

Java HashMap构造器

  • HashMap()-构造一个空的HashMap(),其默认初始容量(16)和默认负载因子(0.75)。
  • HashMap(int initialCapacity)-构造一个空的HashMap(),具有给定的初始容量和默认的负载系数(0.75)。
  • HashMap(int initialCapacity, float loadFactor)-使用给定的初始容量和负载因子构造一个空的HashMap()
  • HashMap(Map<? extends K,? extends V> m) —构造一个新的HashMap(),其映射与给定的Map相同。

K是映射键的类型,V是映射值的类型。

Java HashMap方法

下表提供了几种HashMap方法。

修饰符和类型 方法 描述
void clear() 从映射中删除所有映射。
Object clone() 返回HashMap实例的浅表副本:键和值本身不会被克隆。
boolean containsKey(Object key) 如果此映射包含指定键的映射,则返回true
Set<Map.Entry<K, V>> entrySet() 返回此映射中包含的映射的Set视图。
boolean isEmpty() 如果此映射为空,则返回true
Set<K> keySet() 返回此映射中包含的键的Set视图。
V put(K key, V value) 向映射添加新的映射。
V remove(Objec key) 如果存在,则从此映射中删除指定键的映射。
V get(Object key) 返回指定键所映射到的值;如果此映射不包含键的映射关系,则返回null
void forEach(BiConsumer<? super K, ? super V> action) 在此映射中为每个条目执行给定的操作,直到所有条目都已处理或该操作引发异常。
V replace(K key, V value) 仅当当前映射到某个值时,才替换指定键的条目。
int size() 返回此映射中的键值映射数。
Collection<V> values() 返回此映射中包含的值的Collection视图。

在本教程中,我们将使用其中的几种方法。

Java HashMap创建

new关键字创建HashMap

  1. Map<String, String> capitals = new HashMap<>();

我们在尖括号之间指定键的类型和值。 由于类型推断,因此不必在声明的右侧提供类型。

Java HashMap put()

put()方法用于向映射添加新的映射。

  1. capitals.put("svk", "Bratislava");

第一个参数是键,第二个是值。

Java HashMap remove()

remove()方法用于从映射中删除一对。

  1. capitals.remove("pol");

参数是要从映射中删除其映射的键。

Java HashMap初始化

从 Java 9 开始,我们有了用于HashMap初始化的工厂方法。

com/zetcode/HashMapInit.java

  1. package com.zetcode;
  2. import java.util.Map;
  3. import static java.util.Map.entry;
  4. // factory initialization methods since Java 9
  5. public class HashMapInit {
  6. public static void main(String[] args) {
  7. // up to 10 elements:
  8. Map<Integer, String> colours = Map.of(
  9. 1, "red",
  10. 2, "blue",
  11. 3, "brown"
  12. );
  13. System.out.println(colours);
  14. // any number of elements
  15. Map<String, String> countries = Map.ofEntries(
  16. entry("de", "Germany"),
  17. entry("sk", "Slovakia"),
  18. entry("ru", "Russia")
  19. );
  20. System.out.println(countries);
  21. }
  22. }

该示例使用Map.ofMap.ofEntries初始化哈希图。 这两个工厂方法返回不可修改的映射。

com/zetcode/HashMapInit2.java

  1. package com.zetcode;
  2. import java.util.HashMap;
  3. import java.util.Map;
  4. // up to Java8
  5. public class HashMapInit2 {
  6. public static void main(String[] args) {
  7. Map<String, String> countries = new HashMap<>() {{
  8. put("de", "Germany");
  9. put("sk", "Slovakia");
  10. put("ru", "Russia");
  11. }};
  12. System.out.println(countries);
  13. }
  14. }

在此示例中,我们创建了一个可修改的哈希图。 这种初始化方式称为双括号哈希图初始化。

Java HashMap大小示例

HashMap的大小由size()方法确定。

com/zetcode/HashMapSize.java

  1. package com.zetcode;
  2. import java.util.HashMap;
  3. import java.util.Map;
  4. public class HashMapSize {
  5. public static void main(String[] args) {
  6. Map<String, String> capitals = new HashMap<>();
  7. capitals.put("svk", "Bratislava");
  8. capitals.put("ger", "Berlin");
  9. capitals.put("hun", "Budapest");
  10. capitals.put("czk", "Prague");
  11. capitals.put("pol", "Warsaw");
  12. capitals.put("ita", "Rome");
  13. int size = capitals.size();
  14. System.out.printf("The size of the HashMap is %d%n", size);
  15. capitals.remove("pol");
  16. capitals.remove("ita");
  17. size = capitals.size();
  18. System.out.printf("The size of the HashMap is %d%n", size);
  19. }
  20. }

在代码示例中,我们创建HashMap并使用size()确定其大小。 然后,我们删除一些对,然后再次确定其大小。 我们将发现结果打印到控制台。

  1. capitals.put("svk", "Bratislava");
  2. capitals.put("ger", "Berlin");

使用put(),我们将新的对添加到HashMap中。

  1. int size = capitals.size();

在这里,我们得到映射的大小。

  1. capitals.remove("pol");
  2. capitals.remove("ita");

使用remove(),我们从映射中删除了两对。

  1. The size of the HashMap is 6
  2. The size of the HashMap is 4

这是示例的输出。

Java HashMap get()

要从HashMap检索值,我们使用get()方法。 它以键作为参数。

com/zetcode/HashMapRetrieve.java

  1. package com.zetcode;
  2. import java.util.HashMap;
  3. import java.util.Map;
  4. public class HashMapRetrieve {
  5. public static void main(String[] args) {
  6. Map<String, String> capitals = new HashMap<>();
  7. capitals.put("svk", "Bratislava");
  8. capitals.put("ger", "Berlin");
  9. capitals.put("hun", "Budapest");
  10. capitals.put("czk", "Prague");
  11. capitals.put("pol", "Warsaw");
  12. capitals.put("ita", "Rome");
  13. String cap1 = capitals.get("ita");
  14. String cap2 = capitals.get("svk");
  15. System.out.println(cap1);
  16. System.out.println(cap2);
  17. }
  18. }

在示例中,我们从映射中检索两个值。

  1. String cap2 = capitals.get("svk");

在这里,我们得到一个具有"svk"键的值。

Java HashMap clear()

clear()方法从HashMap中删除所有对。

com/zetcode/HashMapClear.java

  1. package com.zetcode;
  2. import java.util.HashMap;
  3. import java.util.Map;
  4. public class HashMapClear {
  5. public static void main(String[] args) {
  6. Map<String, String> capitals = new HashMap<>();
  7. capitals.put("svk", "Bratislava");
  8. capitals.put("ger", "Berlin");
  9. capitals.put("hun", "Budapest");
  10. capitals.put("czk", "Prague");
  11. capitals.put("pol", "Warsaw");
  12. capitals.put("ita", "Rome");
  13. capitals.clear();
  14. if (capitals.isEmpty()) {
  15. System.out.println("The map is empty");
  16. } else {
  17. System.out.println("The map is not empty");
  18. }
  19. }
  20. }

在该示例中,我们删除了所有元素,并将映射的大小打印到控制台。

  1. capitals.clear();

我们用clear()删除所有对。

  1. if (capitals.isEmpty()) {
  2. System.out.println("The map is empty");
  3. } else {
  4. System.out.println("The map is not empty");
  5. }

使用isEmpty()方法,我们检查映射是否为空。

Java HashMap containsKey()

如果映射包含指定键的映射,则containsKey()方法返回true

com/zetcode/HashMapContainsKey.java

  1. package com.zetcode;
  2. import java.util.HashMap;
  3. import java.util.Map;
  4. public class HashMapContainsKey {
  5. public static void main(String[] args) {
  6. Map<String, String> capitals = new HashMap<>();
  7. capitals.put("svk", "Bratislava");
  8. capitals.put("ger", "Berlin");
  9. capitals.put("hun", "Budapest");
  10. capitals.put("czk", "Prague");
  11. capitals.put("pol", "Warsaw");
  12. capitals.put("ita", "Rome");
  13. String key1 = "ger";
  14. String key2 = "rus";
  15. if (capitals.containsKey(key1)) {
  16. System.out.printf("HashMap contains %s key%n", key1);
  17. } else {
  18. System.out.printf("HashMap does not contain %s key%n", key1);
  19. }
  20. if (capitals.containsKey(key2)) {
  21. System.out.printf("HashMap contains %s key%n", key2);
  22. } else {
  23. System.out.printf("HashMap does not contain %s key%n", key2);
  24. }
  25. }
  26. }

在示例中,我们检查映射是否包含两个键。

  1. if (capitals.containsKey(key1)) {
  2. System.out.printf("HashMap contains %s key%n", key1);
  3. } else {
  4. System.out.printf("HashMap does not contain %s key%n", key1);
  5. }

if语句根据映射是否包含给定键输出消息。

  1. HashMap contains ger key
  2. HashMap does not contain rus key

这是输出。

Java HashMap replace()

replace()方法使程序员可以替换条目。

  1. replace(K key, V value)

仅当当前映射到某个值时,此方法才替换指定键的条目。

  1. replace(K key, V oldValue, V newValue)

仅当当前映射到指定值时,此方法才替换指定键的条目。

com/zetcode/HashMapReplace.java

  1. package com.zetcode;
  2. import java.util.HashMap;
  3. import java.util.Map;
  4. public class HashMapReplace {
  5. public static void main(String[] args) {
  6. Map<String, String> capitals = new HashMap<>();
  7. capitals.put("day", "Monday");
  8. capitals.put("country", "Poland");
  9. capitals.put("colour", "blue");
  10. capitals.replace("day", "Sunday");
  11. capitals.replace("country", "Russia", "Great Britain");
  12. capitals.replace("colour", "blue", "green");
  13. capitals.entrySet().forEach(System.out::println);
  14. }
  15. }

在示例中,我们将映射中的对替换为replace()

  1. capitals.replace("day", "Sunday");

在这里,我们替换"day"键的值。

  1. capitals.replace("country", "Russia", "Great Britain");

在这种情况下,由于键当前未设置为"Russia",因此不会替换该值。

  1. capitals.replace("colour", "blue", "green");

由于旧值正确,因此将替换该值。

  1. country=Poland
  2. colour=green
  3. day=Sunday

这是输出。

Java HashMap转换为List

在下一个示例中,我们将HashMap条目转换为条目列表。

com/zetcode/HashMapConvert.java

  1. package com.zetcode;
  2. import java.util.ArrayList;
  3. import java.util.List;
  4. import java.util.Map;
  5. import java.util.Set;
  6. public class HashMapConvert {
  7. public static void main(String[] args) {
  8. Map<String, String> colours = Map.of(
  9. "AliceBlue", "#f0f8ff",
  10. "GreenYellow", "#adff2f",
  11. "IndianRed", "#cd5c5c",
  12. "khaki", "#f0e68c"
  13. );
  14. Set<Map.Entry<String, String>> entries = colours.entrySet();
  15. List<Map.Entry<String, String>> mylist = new ArrayList<>(entries);
  16. System.out.println(mylist);
  17. }
  18. }

entrySet()返回映射的设置视图,该视图随后传递给ArrayList的构造器。

使用forEach()迭代HashMap

我们使用 Java8 forEach()方法来迭代HashMap的键值对。 forEach()方法对映射的每个元素执行给定的操作,直到所有元素都已处理或该操作引发异常。

com/zetcode/HashMapForEach.java

  1. package com.zetcode;
  2. import java.util.HashMap;
  3. import java.util.Map;
  4. public class HashMapForEach {
  5. public static void main(String[] args) {
  6. Map<String, String> capitals = new HashMap<>();
  7. capitals.put("svk", "Bratislava");
  8. capitals.put("ger", "Berlin");
  9. capitals.put("hun", "Budapest");
  10. capitals.put("czk", "Prague");
  11. capitals.put("pol", "Warsaw");
  12. capitals.put("ita", "Rome");
  13. capitals.forEach((k, v) -> System.out.format("%s: %s%n", k, v));
  14. }
  15. }

在代码示例中,我们使用 lambda 表达式迭代了HashMapforEach()

  1. capitals.forEach((k, v) -> System.out.format("%s: %s%n", k, v));

使用forEach(),我们遍历了映射的所有对。

使用增强的for循环迭代HashMap

Java 5 中引入的增强的for循环可用于对HashMap进行迭代。

com/zetcode/HashMapEnhancedFor.java

  1. package com.zetcode;
  2. import java.util.HashMap;
  3. import java.util.Map;
  4. public class HashMapEnhancedFor {
  5. public static void main(String[] args) {
  6. Map<String, String> capitals = new HashMap<>();
  7. capitals.put("svk", "Bratislava");
  8. capitals.put("ger", "Berlin");
  9. capitals.put("hun", "Budapest");
  10. capitals.put("czk", "Prague");
  11. capitals.put("pol", "Warsaw");
  12. capitals.put("ita", "Rome");
  13. for (Map.Entry<String, String> pair: capitals.entrySet()) {
  14. System.out.format("%s: %s%n", pair.getKey(), pair.getValue());
  15. }
  16. }
  17. }

在该示例中,我们迭代具有增强的for循环的HashMap

  1. for (Map.Entry<String, String> pair: capitals.entrySet()) {
  2. System.out.format("%s: %s%n", pair.getKey(), pair.getValue());
  3. }

在每个for周期中,都将新的键值对分配给pair变量。

Java HashMap迭代键

我们可能只想遍历HashMap的键。

com/zetcode/HashMapKeys.java

  1. package com.zetcode;
  2. import java.util.HashMap;
  3. import java.util.Map;
  4. import java.util.Set;
  5. public class HashMapKeys {
  6. public static void main(String[] args) {
  7. Map<String, String> capitals = new HashMap<>();
  8. capitals.put("svk", "Bratislava");
  9. capitals.put("ger", "Berlin");
  10. capitals.put("hun", "Budapest");
  11. capitals.put("czk", "Prague");
  12. capitals.put("pol", "Warsaw");
  13. capitals.put("ita", "Rome");
  14. Set<String> keys = capitals.keySet();
  15. keys.forEach(System.out::println);
  16. }
  17. }

该示例迭代capitals映射的键。

  1. Set<String> keys = capitals.keySet();

keySet()方法检索HashMap的键,该方法返回键Set。 键必须唯一; 因此,我们有一个SetSet是一个不包含重复元素的集合。

  1. keys.forEach(System.out::println);

我们用forEach()遍历键集。

Java HashMap迭代值

我们可能只想对HashMap的值进行迭代。

com/zetcode/HashMapValues.java

  1. package com.zetcode;
  2. import java.util.Collection;
  3. import java.util.HashMap;
  4. import java.util.Map;
  5. public class HashMapValues {
  6. public static void main(String[] args) {
  7. Map<String, String> capitals = new HashMap<>();
  8. capitals.put("svk", "Bratislava");
  9. capitals.put("ger", "Berlin");
  10. capitals.put("hun", "Budapest");
  11. capitals.put("czk", "Prague");
  12. capitals.put("pol", "Warsaw");
  13. capitals.put("ita", "Rome");
  14. Collection<String> vals = capitals.values();
  15. vals.forEach(System.out::println);
  16. }
  17. }

该示例迭代HashMap的值。

  1. Collection<String> vals = capitals.values();

HashMap的值通过values()方法检索。

  1. vals.forEach(System.out::println);

我们使用forEach()遍历集合。

HashMap过滤

可以使用 Java 流 API 的filter()方法过滤HashMap

com/zetcode/HashMapFilter.java

  1. package com.zetcode;
  2. import java.util.HashMap;
  3. import java.util.Map;
  4. import java.util.stream.Collectors;
  5. public class HashMapFilter {
  6. public static void main(String[] args) {
  7. Map<String, String> capitals = new HashMap<>();
  8. capitals.put("svk", "Bratislava");
  9. capitals.put("ger", "Berlin");
  10. capitals.put("hun", "Budapest");
  11. capitals.put("czk", "Prague");
  12. capitals.put("pol", "Warsaw");
  13. capitals.put("ita", "Rome");
  14. Map<String, String> filteredCapitals = capitals.entrySet().stream()
  15. .filter(map -> map.getValue().length() == 6)
  16. .collect(Collectors.toMap(Map.Entry::getKey, Map.Entry::getValue));
  17. filteredCapitals.entrySet().forEach(System.out::println);
  18. }
  19. }

在示例中,我们将映射过滤为仅包含值大小等于 6 的对。

  1. czk=Prague
  2. ger=Berlin
  3. pol=Warsaw

这是输出。

其他语言的 Java HashMap等效项

Ruby 具有哈希,Perl 具有哈希,PHP 具有数组,Python 具有字典,C# 具有字典,JavaScript 具有映射。

ruby_hash.rb

  1. #!/usr/bin/ruby
  2. stones = { 1 => "garnet", 2 => "topaz",
  3. 3 => "opal", 4 => "amethyst"
  4. }
  5. stones.each { |k, v| puts "Key: #{k}, Value: #{v}" }

这是 Ruby 中的哈希。

perl_hash.py

  1. #!/usr/bin/perl
  2. my %stones = ( 1 => "garnet", 2 => "topaz",
  3. 3 => "opal", 4 => "amethyst" );
  4. while ( my ($k, $v) = each %stones ) {
  5. print "$k: $v\n";
  6. }

这是一个 Perl 哈希。

php_array.php

  1. <?php
  2. $stones = [
  3. 1 => "garnet",
  4. 2 => "topaz",
  5. 3 => "opal",
  6. 4 => "amethyst"
  7. ];
  8. foreach ($stones as $key => $value) {
  9. echo "$key: $value\n";
  10. }
  11. ?>

这是一个 PHP 数组。

python_dictionary.py

  1. #!/usr/bin/python
  2. stones = { 1 : "garnet",
  3. 2 : "topaz",
  4. 3 : "opal",
  5. 4 : "amethyst" }
  6. for key, value in stones.items():
  7. print("{}: {}".format(key, value))

这是 Python 字典。

csharp_dictionary.cs

  1. using System;
  2. using System.Collections.Generic;
  3. public class DictionaryExample {
  4. static void Main() {
  5. Dictionary<int, string> stones = new Dictionary<int, string> {
  6. { 1, "garnet" },
  7. { 2, "topaz" },
  8. { 3, "opal" },
  9. { 4, "amethyst" },
  10. };
  11. Console.WriteLine("Keys and values of the dictionary:");
  12. foreach(KeyValuePair<int, string> kvp in stones) {
  13. Console.WriteLine("Key = {0}, Value = {1}", kvp.Key, kvp.Value);
  14. }
  15. }
  16. }

这是 C# 词典。

javascript_map.js

  1. var stones = new Map();
  2. stones.set(1, 'garnet');
  3. stones.set(2, 'topaz');
  4. stones.set(3, 'opal');
  5. stones.set(4, 'amethyst');
  6. stones.forEach(function(value, key) {
  7. console.log(key + ': ' + value);
  8. });

这是一个 JavaScript 映射。

在本教程中,我们介绍了 Java HashMap集合。 您可能也对相关教程感兴趣: Java 中的HashMap迭代Java ArrayList教程Java HashSet教程Java static关键字Java 教程

列出所有 Java 教程

{% endraw %}