具有空键和空值的哈希映射

2022-09-01 06:29:55

请考虑以下代码:

import java.util.*;

class Employee {
    
    String name;
    
    public Employee(String nm) {
        this.name=nm;
    }
}

public class HashMapKeyNullValue {
    
    Employee e1;
    
    public void display(){

        Employee e2=null;
        Map map=new HashMap();

        map.put(e2, "25");
        System.out.println("Getting the Value When e2 is set as KEY");
        System.out.println("e2 : "+map.get(e2));
        System.out.println("e1 : "+map.get(e1));
        System.out.println("null : "+map.get(null));

        map.put(e1, "");
        System.out.println("Getting the Value when e1 is set as KEY");
        System.out.println("e2 : "+map.get(e2));
        System.out.println("e1 : "+map.get(e1));
        System.out.println("null : "+map.get(null));

        map.put(null, null);   // null as key and null as value
        System.out.println("Getting the Value when setting null as KEY and null as value");
        System.out.println("e2 : "+map.get(e2));
        System.out.println("e1 : "+map.get(e1));
        System.out.println("null : "+map.get(null));

        map.put(null, "30");
        System.out.println("Getting the Value when setting only null as KEY");
        System.out.println("e2 : "+map.get(e2));
        System.out.println("e1 : "+map.get(e1));
        System.out.println("null : "+map.get(null));
    }
    
    public static void main(String[] args) {
        
        new HashMapKeyNullValue().display();
        
    }
}

程序的输出为:

Getting the Value When e2 is set as KEY
e2 : 25
e1 : 25
null : 25
Getting the Value when e1 is set as KEY
e2 : 
e1 : 
null : 
Getting the Value when setting null as KEY and null as value
e2 : null
e1 : null
null : null
Getting the Value when setting only null as KEY
e2 : 30
e1 : 30
null : 30

在这里,作为键是如何相互关联的。是否所有三者都分配给相同的哈希码?如果是,为什么?e1, e2, and null

由于这三者看起来都不同,因此一个值的变化会改变另一个值。这是否意味着,只有一个密钥条目被制作成任何一个?因为所有都被视为相同的密钥。HashMape1, e2 or null


答案 1

当 null 作为 key 传递并且 null Key 作为特例处理时,HashMap 不会调用哈希码。

看跌期权方法

HashMap键放在存储桶 0 中,并将作为键映射到传递的值。HashMap通过链表数据结构做到这一点。HashMap在内部使用链表数据结构。

HashMap(中的静态类)使用的链接列表数据结构HashMap.java)

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

在 Entry 类中,K 设置为 null,值映射到 put 方法中传递的值。

获取方法

Hashmap get 方法中,检查密钥是否作为 null 传递。存储桶 0键的搜索值。

因此,一个对象中只能有一个空键hashmap


答案 2

如果作为映射键传递,它将转到 。空键的所有值都将转到此处。这就是为什么它返回相同的值,因为您提供的所有键都位于HashMap的同一存储桶中。null0 bucketnull