amb*_*bar 5 java string stringbuilder hashmap stringbuffer
我试图理解为什么 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());
Run Code Online (Sandbox Code Playgroud)
上面的代码片段打印“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());
Run Code Online (Sandbox Code Playgroud)
上面的代码片段打印“2”。
谁能解释一下为什么行为不同。
小智 4
StringBuilder/Buffer 不会覆盖 hashCode 和 equals。这意味着对象的每个实例都应该是唯一的哈希码,并且它的值或状态并不重要。您应该使用字符串作为键。
StringBuilder/Buffer 也是可变的,这通常不是一个好主意,用作 HashMap 的键,因为将值存储在其下可能会导致该值在修改后无法访问。