String Vs Stringbuffer as HashMap key(String Vs Stringbuffer 作为 HashMap 键)
问题描述
我试图理解为什么 String 和 Stringbuilder/StringBuffer 在用作 Hashmap 键时会被区别对待.让我通过以下插图更清楚地说明我的困惑:
I am trying to understand why String and Stringbuilder/StringBuffer are treated differently when used as Hashmap keys. Let me make my confusion clearer with the following illustrations:
示例 #1,使用字符串:
Example #1, using String:
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());
上面的代码片段打印1".
Above code snippet prints '1'.
示例 #2,使用 StringBuilder(或 StringBuffer):
Example #2, using StringBuilder(or 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());
上面的代码片段打印2".
The above code snippet prints '2'.
谁能解释一下为什么会出现这种行为差异.
Could anyone please explain why the difference in behaviour.
推荐答案
StringBuilder/Buffer 不覆盖 hashCode 和 equals.这意味着对象的每个实例都应该是唯一的哈希码,并且它的值或状态无关紧要.您应该使用字符串作为键.
StringBuilder/Buffer do not override hashCode and equals. This means each instance of the object should be a unique hash code and the value or state of it does not matter. You should use the String for a key.
StringBuilder/Buffer 也是可变的,这通常不是用作 HashMap 的键的好主意,因为将值存储在其下可能会导致修改后无法访问该值.
StringBuilder/Buffer is also mutable which is generally not a good idea to use as a key for a HashMap since storing the value under it can cause the value to be inaccessible after modification.
http://grepcode.com/file/repository.grepcode.com/java/root/jdk/openjdk/6-b14/java/lang/StringBuilder.java
这篇关于String Vs Stringbuffer 作为 HashMap 键的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持编程学习网!
本文标题为:String Vs Stringbuffer 作为 HashMap 键


基础教程推荐
- Java Swing计时器未清除 2022-01-01
- 验证是否调用了所有 getter 方法 2022-01-01
- 从 python 访问 JVM 2022-01-01
- 多个组件的复杂布局 2022-01-01
- 在 Java 中创建日期的正确方法是什么? 2022-01-01
- 大摇大摆的枚举 2022-01-01
- 如何在 Spring @Value 注解中正确指定默认值? 2022-01-01
- 不推荐使用 Api 注释的描述 2022-01-01
- Java 实例变量在两个语句中声明和初始化 2022-01-01
- 如何在 JFrame 中覆盖 windowsClosing 事件 2022-01-01