面试记录之 HashMap 的 get 方法

主要是记录一次面试中问到的hashMap面试题,防止以后遇到还是不会

问题:

HashMap<String, String> map = new HashMap<>();
String a = new String(“1”);
String b = new String(“1”);
map.put(a,“value”);
那么 map.get(a) 和 map.get(b)是否相等

这个我一开始想是不相等,因为都知道map在用对象当 key 的时候,都是把对象的地址值当 key 。那 a 和 b 都是 new 出来的,地址值显然不相等。我想着应该是不相等,但是运行完,发现居然相等

在这里插入图片描述
瞬间不理解了,因此翻看了源码。先从 map 的 put 方法入手,看在是基础数据类型时候是不是有什么变化

查找原因 :从HashMap 的 get 源码入手

public V get(Object key) {
    
    
   Node<K,V> e;
   return (e = getNode(hash(key), key)) == 
   					null ? null : e.value;
}

这里发现在 get 的时候,对 key 做了 hash。所以推论,应该是两个 String 对象的 hash 值相同。那么有去看了 String 的 hash 源码,大家可以去搜索相关的 String 的hashCode算法

最终得到结论,String 的 hashCode 是根据 String 的值去算的。 因此只要是同一个值,那么 hashCode 都一样

所以这里想起来了有一个面试常说的点:

一个字符串的哈希码只算一次,就被缓存下来,以后就不用重复劳动啦!

Integer 更是简单 ,hashCode 就是值

    public int hashCode() {
    
    
        return Integer.hashCode(value);
    }
    
	public static int hashCode(int value) {
    
    
        return value;
    }

到此为止 - 结论

HashMap还是因为 key 的 hash 值相等,导致拿到想同的数据。
String 、 Integer 都是因为值相等, hashCode 也相等的原因,所以 hashMap 认为是相同的 key!

判断 HashMap 的 key 是否重复,就看 key 的 hash 值是否重复!

猜你喜欢

转载自blog.csdn.net/qq_37761711/article/details/130297600