HashMap<String, String> map = new HashMap<>();
map.put("first", " 我是第一次插值");
String temKey = new String("first");
map.put(temKey, " 我是第二次插值");
// 问题1:为何还是覆盖了相同键的值?。。。我这而键是不同的对象了啊,按理来说不应该不会覆盖了
// 问题2:String temKey = new String("first"); 这而的 new String为何是灰色的?
System.out.println("map集合的元素个数: " + map.size());
map.entrySet().forEach(stringStringEntry -> {
String key = stringStringEntry.getKey();
String value = stringStringEntry.getValue();
System.out.println("元素" + key + ", 其值是: " + value);
});
结果:
map集合的元素个数: 1
元素first, 其值是: 我是第二次插值
问题1:"first" new String("first")引用地址不同,但作为map的键值时是使用的字符串的内容值比较,这2个是相同,所以就覆盖了。 如果按照引用地址不同比较,这样涉设计估计太隐晦了,估计使用时都错了
问题2:IDE的提示是冗余的,鼠标飘上去可以看到。 String temKey = "first" 只要这样写就够了
字符串 虽然是对象, 但是你可以当做值类型来理解的。 相同内容的文本在程序里虽然引用不同,但是地址是同一个
如果我没有记错的话,两个对象,如果A.Equals(B) == true的话,就视为是同一个哈希key。
hashmap的put方法保存key不是直接保存的引用或原始值,
你自己debug把first传进hash(key)然后tab[i = (n - 1) & hash])这个i就是最终key了