为什么下面程序的输出是1而不是2?

时间:2019-08-26 05:18:52

标签: java string

由于s3是在堆中创建的,而s1和s2是在字符串常量池中创建的,因此应将s3和s2视为不同的键,并且输出应为2。

但是输出结果为1。

public static void main(String[] args) {


    Map<String,String> map = new HashMap<String,String>();
    String s1 = "vivek";
    String s2 = "vivek";
    String s3 = new String("vivek");

    map.put(s1, "vivek");
    map.put(s2, "vivek");
    map.put(s3, "vivek");

    System.out.println(map.size());

}

2 个答案:

答案 0 :(得分:1)

HashMap类在put操作上指定以下内容:

  

如果映射先前包含键的映射,则旧值   被替换。

因此,您已用每个put操作替换了旧值,并且HashMap中只有一项。

另请参阅相关的javadoc

问题是为什么put方法假定键对于s1,s2和s3是相同的。 HashCode for String是通过执行基础字符存储(值)的计算来实现的。变量s1,s2和s3中的字符完全相同,因此它们将导致相同的HashCode。

来自StringUTF16的openjdk实现(值是字符存储):

public static int hashCode(byte[] value) {
    int h = 0;
    int length = value.length >> 1;
    for (int i = 0; i < length; i++) {
        h = 31 * h + getChar(value, i);
    }
    return h;
}

HashMap还使用等于来比较键。之所以有效,是因为equals和hashCode方法之间的隐式协定。它指出:

  

如果根据equals(Object)方法两个对象相等,则在两个对象中的每个对象上调用hashCode方法必须产生相同的整数结果。

因此,如果与equals的比较为它们返回true,则HashMap可以安全地假定2个对象的HashCode相同。

请参见javadoc of the hashCode Method for Object

答案 1 :(得分:0)

HashMap没有使用内存地址,因此不相关。它在字符串之间使用.equals(),因此您每次都分配给相同的键。因此,您只有1个具有值的键。