HashMap中的重复值

时间:2015-11-09 09:45:27

标签: java hashmap equals stringbuilder hashcode

我遇到了大麻烦,创建了一个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
}

} `

6 个答案:

答案 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不会覆盖equalshashCode,因此使用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

此处还创建了新对象sb1sb,这些对象与先前创建的不同,但内容相同,但引用不同。

  

同时尝试将地图更改为

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