我遇到了大麻烦,创建了一个hashMap并使用相同的键插入了两个值 StringBuilder作为地图的关键。 现在,在尝试使用StringBuilder对象检索数据时工作正常,但在其他情况下,它无法返回任何值。我在下面给出的代码中列出了三种情况,
`
class MainClass {
public static void main(String[] args) {
MainClass m = new MainClass();
StringBuilder sb = new StringBuilder("sb");
StringBuilder sb1 = new StringBuilder("sb");
Map<StringBuilder, String> map = new HashMap<StringBuilder, String>();
map.put(sb, "a");
map.put(sb1, "b");
System.out.println("----Inside Main method---- mapValue"+map);
System.out.println("Expected value a, coming also => " + map.get(sb)); //a
System.out.println("Expected value b, coming also => " + map.get(sb1)); //b
System.out.println("Expected value a, not coming => " + map.get("sb")); // why null ?
m.receiveMap(map, sb, sb1);
}
public void receiveMap(Map<StringBuilder, String> map, StringBuilder refSb,StringBuilder refSb1) {
StringBuilder sb = new StringBuilder("sb");
StringBuilder sb1 = new StringBuilder("sb");
System.out.println("----Inside receiveMap method mapValue"+map);
System.out.println("Expected value a, not coming => " + map.get(sb)); // why null ?
System.out.println("Expected value b, not coming => " + map.get(sb1)); // why null ?
System.out.println("Expected value a, coming also => " + map.get(refSb)); // o/p - a
System.out.println("Expected value b, coming also => " + map.get(refSb1)); // o/p -b
}
} `
答案 0 :(得分:2)
receiveMap
中的
System.out.println("Expected value a, not coming => " + map.get(sb)); // why null ?
因为您在具有不同的方法中创建了新的StringBuilder
sb
hashcode与StringBuilder sb PSVM 进行比较。
StringBuilder不会覆盖equals和hashCode
StringBuilder sb = new StringBuilder("sb");
StringBuilder sb1 = new StringBuilder("sb");
Set s = new HashSet();
s.add(sb);
s.add(sb1);
System.out.println(s);
Set不允许重复,但仍会打印[sb, sb]
,因为StringBuilder不会覆盖equals和hashcode方法。
答案 1 :(得分:1)
简单,一个StringBuilder
实例不等于另一个(因此它们将获得不同的哈希码,并作为单独的实体处理)。仅仅因为2 StringBuilder
(或任何对象)具有相同的值,这并不意味着它们是相同的。
答案 2 :(得分:1)
与String
不同,StringBuilder
不会覆盖equals
和hashCode
,因此使用Object
类的默认实现。因此,sb.equals(sb1)
为false,即使它们包含相同的字符。
我建议您使用String
代替StringBuilder
作为地图的关键。
答案 3 :(得分:0)
您创建了StringBuilder
的不同实例,这些实例不相同。
你自己已经测试了几乎所有场景,混淆应该是清楚的。
StringBuilder
不会覆盖hashCode()
和equals()
方法,HashMap
需要正常工作。
System.out.println(&#34;预期值a,未来=&gt;&#34; + map.get(&#34; SB&#34)); //为什么
新StringBuilder object
已创建并通过。
> StringBuilder sb = new StringBuilder("sb");
> StringBuilder sb1 = new StringBuilder("sb");
> System.out.println("----Inside receiveMap method mapValue" + map);
> System.out.println("Expected value a, not coming => " + map.get(sb)); // why
> System.out.println("Expected value b, not coming => " + map.get(sb1)); // why
此处还创建了新对象sb1
和sb
,这些对象与先前创建的不同,但内容相同,但引用不同。
同时尝试将地图更改为
Map<String, String> map = new HashMap<String, String>();
并使用
.toString()
方法,您将观察到不同的行为, 因为String
类会覆盖hashCode()
和equals()
方法。
答案 4 :(得分:0)
您正在传递不在Map中的对象,因此它返回null。每次传递正确的对象,您都会获得价值。
答案 5 :(得分:0)
使用StringBuilder它永远不会工作,因为一个实例不等于另一个StringBuilder实例
将您的代码更正为此类
Map<String, String> map = new HashMap<String, String>();
map.put(sb.toString(), "a");
map.put(sb1.toString(), "b");
但由于这是一个地图表示,如果sb.toString()和sb1.toString()在您的示例中相同,则该值将被覆盖
因此,对代码进行更正的输出为
----Inside Main method---- mapValue{sb=b}
Expected value a, coming also => b
Expected value b, coming also => b
Expected value a, not coming => b
----Inside receiveMap method mapValue{sb=b}
Expected value a, not coming => b
Expected value b, not coming => b
Expected value a, coming also => b
Expected value b, coming also => b