为什么HashMap会覆盖现有的字符串键值

时间:2017-10-04 16:34:12

标签: java hashmap

String abc = "abc";
String abc2 = new String("abc");
System.out.println(abc == abc2); //false
Map<String, Integer> map = new HashMap<String, Integer>();
map.put(abc, 2);
System.out.println("map.get(abc)" + map.get("abc")); //2
map.put(abc2, 1234);
System.out.println("map.get(abc)" + map.get("abc")); //1234

如果abcabc2不相等,那么为什么Hashmap会覆盖值?

3 个答案:

答案 0 :(得分:1)

Map是一个存储(key/value)(称为Entry)元素的结构,keysunique

由于abc.equals(abc2)trueabc2将取代abc

要检查相等性,您需要使用.equals()而不是==作为参考

abcabc2不一样object==false)并且它们代表SAME字符串(.equals()是{ {1}},因此只有一个可以在true

Map

答案 1 :(得分:0)

由于 abc.equals(abc2) 对于这些值始终为true

虽然 abc == abc2 的参考资料不一定是true

而且据说你将能够理解

map.put(abc, 2);
map.put(abc2, 1234); // overrides the previous value with the same key

答案 2 :(得分:-1)

String根据值生成散列,两个对象的键都相同,因此两个对象都指向相同的键(散列)&amp; abc.equals(abc2)为true所以两个对象都指向同一个条目。

String abc =“abc”;     String abc2 = new String(“abc”);

public int hashCode() {
    int h = hash;
    if (h == 0 && value.length > 0) {
        char val[] = value;

        for (int i = 0; i < value.length; i++) {
            h = 31 * h + val[i];
        }
        hash = h;
    }
    return h;
}