主要是记录一次面试中问到的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 值是否重复!