HashMap简介

Java 中的 HashMap 是一个无序集合,它以键值对(称为条目)的形式存储元素(对象)。

它表示为 HashMap<Key、Value> 或 HashMap<K、V>,其中 K 代表键,V 代表值。键和值都是对象。HashMap 使用一个对象来检索另一个对象。

如果提供了Key,则可以轻松地从 HashMap 中检索其关联值。HashMap 中的键必须是唯一的,这意味着我们不能对 HashMap 中的键使用重复数据。

如果我们尝试插入具有重复键的条目,则HashMap 会用新条目替换旧条目。

Java HashMap 类是 Map 接口的四个具体实现之一。它是在Java 1.2版本中添加的。它可以在java. util.HashMap<K, V>找到它。它在查找值、添加条目和删除条目方面都表现得非常出色。

Java中HashMap类的层次结构


Java 中的 HashMap 类扩展了 AbstractMap 类并实现了 Map 接口。HashMap 的层次结构图如下图所示。

java. util.HashMap<K, V>声明


HashMap 是一个泛型类,可以声明如下:

代码语言:javascript代码运行次数:0运行复制
public class HashMap<K,V>
   extends AbstractMap<K,V>
   implements Map<K,V>, Cloneable, Serializable

Java HashMap 类的特性


HashMap 类有几个功能需要牢记。它们是:

1. HashMap 的底层数据结构是 HashTable。简而言之,HashMap 内部使用哈希表来存储条目。这意味着访问和添加条目的速度几乎与访问数组的速度一样快。

2. 在哈希映射中,插入顺序不被保留(即不保留任何顺序)。这意味着我们无法按照插入 HashMap 的相同顺序检索键和值。

3.它基于键的哈希码,而不是值的哈希码。

4. Java HashMap 仅包含唯一键,这意味着不允许重复键,但值可以重复。我们根据键检索值。

5. 键和值都允许异构对象。

6. Java HashMap 只能有一个空键,因为不允许重复键。

7. 哈希映射中允许多个空值。

8. Java 中的 HashMap 不同步,这意味着在 HashMap 对象上使用多个线程时,我们会得到不可靠的结果。

9. Java HashMap 实现了可克隆和可序列化的接口,但没有实现随机访问。

10. 如果我们的频繁操作是搜索操作,HashMap 是最佳选择。

11. 如果 HashMap 中不存在任何元素,它将抛出一个名为 NoSuchElementException 的异常。

12. Java HashMap 仅存储对象引用。因此,我们不能使用像 double 或 int 这样的原始数据类型。我们可以改用像 Integer 或 Double 这样的包装类。

HashMap 类的构造函数


Java 中的 HashMap 类提供了四个构造函数,如下所示:

1. HashMap():用于构造一个空的 HashMap 对象,默认初始容量为 16,默认填充率(负载因子)为 0.75。创建哈希映射对象的语法如下:

代码语言:javascript代码运行次数:0运行复制
HashMap hmap = new HashMap();
HashMap<K, V> hmap = new HashMap<K,V>(); 

2. HashMap(int initialCapacity):用于在默认加载因子0.75下,创建一个具有指定初始容量的空哈希映射对象。一般语法如下:

代码语言:javascript代码运行次数:0运行复制
HashMap<K,V> hmap = new HashMap<K,V>(int initialCapacity);

3. HashMap(Map m):此构造函数用于通过初始化给定 Map 对象 m 的元素来创建哈希映射对象。

4. HashMap(int initialCapacity, float loadFactor):此构造函数用于创建具有指定初始容量和负载因子的哈希映射对象。

创建具有初始容量和负载因子的哈希映射对象的一般语法如下:

代码语言:javascript代码运行次数:0运行复制
HashMap<K,V> hmap = new HashMap<>(int initialCapacity, float loadFactor);

For example:
      HashMap<String, Integer> hmap = new HashMap<>(30, 0.7f);

在上述语法中,容量是可以存储哈希映射值的存储桶数。负载系数是在容量自动增长之前使用的存储桶数量比例。

该值是一个浮点数,范围从 0(空)到 1.0(满)。0.7 表示当存储桶已满 70% 时,容量增加。默认容量为 16,负载系数为 0.75,这通常就足够了。

Java 中的 HashMap 方法


在本节中,我们列出了 HashMap 类中可用的几个重要方法,如下所示:

1. void clear():用于从指定映射中删除条目。

2. boolean isEmpty():此方法用于检查映射是否为空。如果哈希映射中不存在键值映射,则返回 true,否则返回 false。

3. Object clone(): 它用于创建此哈希映射的浅拷贝。仅克隆哈希映射和所有条目,而不是元素。此映射和新映射共享对相同键和值的引用。 4. Set entrySet(): 它用于返回包含此映射中所有键/值对的集合视图。

5. Set keySet(): 此方法用于检索此映射中键的集合视图。

6. V put(Object key, Object value):此方法用于在映射中插入条目。

7.V put(Object key, Object value):该方法用于将指定地图的所有条目插入到另一张地图中。

8. V putIfAbsent(K 键,V 值):此方法仅在尚未指定时才添加与映射中指定键关联的指定值。

9. V remove(Object key): 此方法用于删除指定键的条目。

10.V putIfAbsent(K key, V value): 此方法从映射中删除与特定键关联的指定值。

11. int size():此方法返回映射中的条目数。

12. Collection values():此方法返回包含映射中所有值的集合视图。

13.  V get(Object key): 此方法用于检索与键关联的值。其返回类型为对象。

14. V replace(K key, V value):该方法用于替换指定键的指定值。

15. boolean replace(K key, V oldValue, V newValue): :此方法用于将旧值替换为指定键的新值。

16. boolean containsValue(Object v): 此方法用于确定映射是否包含特定值。如果某个值等于 v,则返回 true。

17. boolean containsKey(Object k): 此方法用于确定映射是否包含特定键。如果此映射中的某个键等于 k,它将返回 true。

18. boolean containsKey(Object k): T该方法用于将指定的对象与映射进行比较。

Java HashMap示例程序


1.让我们创建一个程序,在HashMap中添加条目并将其显示在控制台上。

程序源代码 1:

代码语言:javascript代码运行次数:0运行复制
import java.util.HashMap;
public class HashMapEx1 {
public static void main(String[] args) 
{
// Create a HashMap.	
  HashMap<String,Integer> hmap = new HashMap<>();
 
// Checking HashMap is empty or not.
   boolean empty = hmap.isEmpty();
   System.out.println("Is HashMap empty: " +empty);
 
// Adding entries in the hash map.
   hmap.put("John", 24); // hmap.size() is 1.
   hmap.put("Deep", 22); // hmap.size() is 2.
   hmap.put("Shubh", 15); // hmap.size() is 3.
   hmap.put("Riky", 22); // hmap.size() is 4. // Adding duplicate value.
   hmap.put("Mark", 30); // hmap.size() is 5.
   
System.out.println("Entries in HashMap: " +hmap);  
int size = hmap.size();
System.out.println("Size of HashMap: " +size);

// Adding null key and value.
   hmap.put(null, null); // hmap.size() is 6.
   System.out.println("Updated entries in HashMap: " +hmap);
   }
}
代码语言:javascript代码运行次数:0运行复制
Output:
      Is HashMap empty: true
      Entries in HashMap: {Riky=22, Shubh=15, John=24, Mark=30, Deep=22}
      Size of HashMap: 5
      Updated entries in HashMap: {null=null, Riky=22, Shubh=15, John=24, Mark=30, Deep=22}

从上面的输出中可以看出,HashMap 中的条目在 map 中插入时,并不能保证输入顺序。我们将 String 存储为键,将 Integer 存储为值,因此我们使用 HashMap<String, Integer> 作为类型。put() 方法将条目添加到映射中。

2. 让我们再举一个示例程序,在该程序中,将尝试在 HashMap 中添加重复的键和值。

程序源代码 2:

代码语言:javascript代码运行次数:0运行复制
import java.util.HashMap;
public class HashMapEx2 {
public static void main(String[] args) 
{	
 HashMap<Integer, String> hmap = new HashMap<>();
   
 hmap.put(5, "Banana");
 hmap.put(10, "Mango");
 hmap.put(15, "Apple");

System.out.println("Entries in HashMap: " +hmap);  
System.out.println("Size of HashMap: " +hmap.size());

// Adding duplicate key in hash map.
   hmap.put(10, "Guava"); // Still hmap.size is 3.
   hmap.put(20, "Banana"); // Adding duplicate value.
   
   System.out.println("Updated entries in HashMap: " +hmap);
   System.out.println("Size after adding duplicate value: " +hmap.size());
   }
}
代码语言:javascript代码运行次数:0运行复制
Output:
      Entries in HashMap: {5=Banana, 10=Mango, 15=Apple}
      Size of HashMap: 3
      Updated entries in HashMap: {20=Banana, 5=Banana, 10=Guava, 15=Apple}
      Size after adding duplicate value: 4

正如您在此程序中看到的,我们不能在 HashMap 中存储重复的键。当尝试使用另一个值存储重复键,它只是替换了该值。

3.让我们创建一个程序,在其中执行删除操作。使用 remove() 方法从 HashMap 中删除条目。查看源代码。

程序源代码 3:

代码语言:javascript代码运行次数:0运行复制
import java.util.HashMap;
public class HashMapEx3 {
public static void main(String[] args) 
{	
 HashMap<Character,String> hmap = new HashMap<>();
   
 hmap.put('R', "Red");
 hmap.put('O', "Orange");
 hmap.put('G', "Green");
 hmap.put('B', "Brown");
 hmap.put('W', "White");

// Displaying HashMap entries.  
   System.out.println("Entries in HashMap: " +hmap);

// Removing Key-Value pairs for key 'B'. 
  Object removeEntry = hmap.remove('B');
  System.out.println("Removed Entry: " +removeEntry);
  System.out.println("HashMap Entries after remove: " +hmap);
  
// Checking entry is removed or not.  
  Object removeEntry2 = hmap.remove('W', "White");
  System.out.println("Is entry removed: " +removeEntry2);
  System.out.println("Updated HashMap entries: " +hmap);
   }
}
代码语言:javascript代码运行次数:0运行复制
Output:
       Entries in HashMap: {R=Red, B=Brown, G=Green, W=White, O=Orange}
       Removed Entry: Brown
       HashMap Entries after remove: {R=Red, G=Green, W=White, O=Orange}
       Is entry removed: true
       Updated HashMap entries: {R=Red, G=Green, O=Orange}

4. 让我们举一个示例程序,其中我们将替换指定键的指定值。查看源代码。

程序源代码 4:

代码语言:javascript代码运行次数:0运行复制
import java.util.HashMap;
public class HashMapEx4 {
public static void main(String[] args) 
{	
 HashMap<Character,String> hmap = new HashMap<>();
   
 hmap.put('R', "Red");
 hmap.put('O', "Orange");
 hmap.put('G', "Green");
 hmap.put('B', "Brown");
 hmap.put('W', "White");

// Displaying HashMap entries.  
   System.out.println("Entries in HashMap: " +hmap);

// Replacing specified value for the specified key.  
   Object replaceValue = hmap.replace('B', "Black");
   System.out.println("Replaced value: " +replaceValue);
   System.out.println("Updated entries in HashMap: " +hmap);
   
  boolean replaceValue2 = hmap.replace('G', "Green", "Greenish");
  System.out.println("Is value replaced: " +replaceValue2);
  System.out.println(hmap);
   }
}
代码语言:javascript代码运行次数:0运行复制
Output:
       Entries in HashMap: {R=Red, B=Brown, G=Green, W=White, O=Orange}
       Replaced value: Brown
       Updated entries in HashMap: {R=Red, B=Black, G=Green, W=White, O=Orange}
       Is value replaced: true
       {R=Red, B=Black, G=Greenish, W=White, O=Orange}

在Java中使用HashMap。


如果我们想执行搜索操作,Java HashMap 可能是最佳选择。它旨在快速找到你想要的东西。这种最好的例子是电话簿。人员姓名(字符串)可用于搜索人员的电话号码。

让我们通过一个简单的示例程序来理解它。查看以下源代码。

程序源代码 5:

代码语言:javascript代码运行次数:0运行复制
import java.util.HashMap;
public class HashMapUse {
public static void main(String[] args) 
{	
 HashMap<String, Long> hmap = new HashMap<>();
   
 hmap.put("John", 9431676282L);
 hmap.put("Deep", 8292736478L);
 hmap.put("Shubh", 8123543268L);
 hmap.put("Mark", 9876789142L);
 hmap.put("Ricky", 8768976872L);

// Retrieve number with its key by calling get() method.
   Long number = hmap.get("Deep");
   System.out.println("Deep's phone number: " +number);
   
   Long number2 = hmap.getOrDefault("Steave", -1L);
   System.out.println("Alex's phone number: " +number2);
   }
}
代码语言:javascript代码运行次数:0运行复制
Output:
      Deep's phone number: 8292736478
      Alex's phone number: -1

在此示例中,我们创建了一个名为电话簿的 HashMap,其中包含字符串(人名)和作为 Long 对象的值(人的电话号码)。对象通过调用 put(Object key, Object value)方法存储在哈希映射中。

此方法在map 上存储一个项目,其中键作为名称,值作为电话号码。hmap.put(“John”, 9431676282L);.如果未找到指定的键,则默认返回 -1。

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。 原始发表:2008-06-23,如有侵权请联系 cloudcommunity@tencent 删除hashmap程序对象java存储