由于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());
}
答案 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相同。
答案 1 :(得分:0)
HashMap没有使用内存地址,因此不相关。它在字符串之间使用.equals(),因此您每次都分配给相同的键。因此,您只有1个具有值的键。