gpt4 book ai didi

java - String 与 Stringbuffer 作为 HashMap 键

转载 作者:塔克拉玛干 更新时间:2023-11-01 22:46:17 26 4
gpt4 key购买 nike

我试图理解为什么 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());

上面的代码片段打印“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());

上面的代码片段打印“2”。

谁能解释一下行为差异的原因。

最佳答案

StringBuilder/Buffer 不会覆盖 hashCode 和 equals。这意味着对象的每个实例都应该是一个唯一的哈希码,它的值或状态无关紧要。您应该使用字符串作为键。

StringBuilder/Buffer 也是可变的,这通常不是用作 HashMap 的键的好主意,因为在其下存储值会导致修改后无法访问该值。

http://grepcode.com/file/repository.grepcode.com/java/root/jdk/openjdk/6-b14/java/lang/StringBuilder.java

关于java - String 与 Stringbuffer 作为 HashMap 键,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23790423/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com