【发布时间】:2014-07-10 12:32:45
【问题描述】:
我试图理解为什么 String 和 Stringbuilder/StringBuffer 在用作 Hashmap 键时会被区别对待。让我通过以下插图更清楚地说明我的困惑:
示例 #1,使用字符串:
String s1 = new String("abc");
String s2 = new String("abc");
HashMap hm = new HashMap();
hm.put(s1, 1);
hm.put(s2, 2);
System.out.println(hm.size());
上面的代码 sn-p 打印 '1'。
示例 #2,使用 StringBuilder(或 StringBuffer):
StringBuilder sb1 = new StringBuilder("abc");
StringBuilder sb2 = new StringBuilder("abc");
HashMap hm = new HashMap();
hm.put(sb1, 1);
hm.put(sb2, 2);
System.out.println(hm.size());
上面的代码 sn -p 打印 '2'。
谁能解释一下为什么会出现这种行为差异。
【问题讨论】:
-
请注意
sb1.equals(sb2)是假的。 -
因为它们是完全不同的东西。字符串是字符串。字符串生成器在将其转换为字符串之前不是字符串。
-
你能解释一下为什么你认为它们应该是一样的吗?
-
造成这种不一致的确切区别是什么。两者都是内部 char[]。不是吗?
-
字符串是不可变的,这意味着它不会改变。 StringBuilder 是可变的,这意味着仅仅因为两个 StringBuilder 现在恰好包含相同的文本,并不意味着它们将来会。
标签: java string hashmap stringbuilder stringbuffer