Java HashMap指南

Java中的HashMap在实现Map接口的集合类中。它用于存储键和值对。每个键都映射到映射中的单个值。

键是唯一的。这意味着我们只能在地图中插入键“ K”一次。不允许重复的密钥。虽然一个值'V'可以映射到多个键。

1。 java.util.HashMap类

1.1。HashMap类声明

HashMap已声明如下:

public class HashMap<K,V> extends AbstractMap<K,V> 
				implements Map<K,V>, Cloneable, Serializable  

1.2。HashMap类层次结构

如上所示,HashMap实现Map接口并扩展AbstractMap类。

HashMap层次结构
HashMap层次结构

2。 Java HashMap功能

  • HashMap不能包含重复的键。
  • HashMap允许多个null值,但只有一个null键。
  • HashMap是一个无序集合。它不保证元素的任何特定顺序。
  • HashMap 不是线程安全的。您必须显式同步对HashMap的并发修改。或者,您可以使用Collections.synchronizedMap(hashMap)来获取HashMap的同步版本。
  • 只能使用关联的键来检索值。
  • HashMap仅存储对象引用。因此,必须将原语与其对应的 Wrapper 类一起使用。如int
  • 将存储为Integer
  • HashMap实现了CloneableSerializable接口。

3。 HashMap内部实现

HashMap按照哈希原理工作。在将任何公式/算法应用于其属性之后,散列是一种为任何变量/对象分配唯一代码的方法。Java中的每个对象都有其哈希码,使得两个相等的对象必须一致地产生相同的哈希码。

3.1。HashMap.Entry类

键值对存储为内部类的实例,该内部类HashMap.Entry具有作为属性存储的键和值映射。键已标记为final

static class Entry<K ,V> implements Map.Entry<K, V>
{
    final K key;
    V value;

    Entry<K ,V> next;
    final int hash;

    ...//More code goes here
}

3.2。内部工作

Entry类的所有实例都存储在声明为的数组中'transient Entry[] table'。对于要存储在HashMap中的每个键值,使用键的哈希码计算哈希值。此哈希值用于计算数组中用于存储Entry对象的索引

发生冲突的情况下,多个键映射到单个索引位置,将形成一个链表以存储所有应该放在单个数组索引位置的所有键-值对。

通过键检索值时,使用键的哈希码找到第一个索引位置。然后,在链表中迭代所有元素,并通过使用equals()方法标识正确的键来找到正确的值对象。

4。 Java HashMap示例

让我们快速浏览一些示例,以在Java中使用HashMap。

4.1。添加键值– HashMap.put()

import java.util.HashMap;

public class HashMapExample 
{
    public static void main(String[] args) throws CloneNotSupportedException 
    {
        HashMap<Integer, String> map = new HashMap<>();
        
        map.put(1,  "A");
        map.put(2,  "B");
        map.put(3,  "C");
        
        System.out.println(map);
    }
}

程序输出。

{1=A, 2=B, 3=C}

4.2。通过键获取价值– HashMap.get()

HashMap<Integer, String> map = new HashMap<>();
        
map.put(1,  "A");
map.put(2,  "B");
map.put(3,  "C");

String value = map.get(2);

System.out.println("The value is :: "+  value );

程序输出。

The value is :: B

4.3。通过键删除配对– HashMap.remove()

HashMap<Integer, String> map = new HashMap<>();

map.put(1, "A");
map.put(2, "B");
map.put(3, "C");

System.out.println(map);

map.remove(3);

System.out.println(map);

程序输出。

{1=A, 2=B, 3=C}
{1=A, 2=B}

4.4。迭代HashMap

请注意,此类的迭代器是快速失败的,如果在创建迭代器之后进行了任何结构修改,它将抛出ConcurrentModificationException

HashMap<Integer, String> map = new HashMap<>();

map.put(1, "A");
map.put(2, "B");
map.put(3, "C");

System.out.println("//Iterate over keys");

Iterator<Integer> itr = map.keySet().iterator();

while (itr.hasNext()) 
{
    Integer key = itr.next();
    String value = map.get(key);
    
    System.out.println("The key is :: " + key + ", and value is :: " + value );
}

System.out.println("//Iterate over entries set");

Iterator<Entry<Integer, String>> entryIterator = map.entrySet().iterator();

while (entryIterator.hasNext()) 
{
    Entry<Integer, String> entry = entryIterator.next();
    
    System.out.println("The key is :: " + entry.getKey() + ", and value is :: " + entry.getValue() );
}

程序输出。

//Iterate over keys
The key is :: 1, and value is :: A
The key is :: 2, and value is :: B
The key is :: 3, and value is :: C

//Iterate over entries set
The key is :: 1, and value is :: A
The key is :: 2, and value is :: B
The key is :: 3, and value is :: C

5。 HashMap方法

HashMap类中的方法列表及其简短描述。

  1. void clear():从HashMap中删除所有键-值对。
  2. Object clone():返回指定HashMap的浅表副本。
  3. boolean containsKey(Object key):返回truefalse基于是否在地图中找到指定的键。
  4. boolean containsValue(Object Value):类似于containsKey()方法,它查找指定的值而不是键。
  5. Object get(Object key):返回HashMap中指定键的值。
  6. boolean isEmpty():检查地图是否为空。
  7. Set keySet():返回存储在HashMap中的所有密钥的Set
  8. Object put(Key k,Value v):将键值对插入HashMap中。
  9. int size():返回地图的大小,该大小等于存储在HashMap中的键值对的数量。
  10. Collection values():返回地图中所有值的集合。
  11. 值remove(Object key):删除指定键的键值对。
  12. putAll(Map m):将地图的所有元素复制到另一个指定的地图。

6。 HashMap教程和示例

如何克隆HashMap

saigon has written 1445 articles

Leave a Reply