Java HashMap即使在重写hashcode&;之后也不会同时检索这两个值;对于同一对象等于

Java HashMap即使在重写hashcode&;之后也不会同时检索这两个值;对于同一对象等于,java,hashmap,hashcode,Java,Hashmap,Hashcode,我知道这个问题相当业余,但我很难理解为什么当我使用同一个对象实例作为键时,hashmap不会存储或检索值。我的代码如下 public class Candidate { private String id; private String name; public Candidate (String id, String name){ this.id = id; this.name = name; } public

我知道这个问题相当业余,但我很难理解为什么当我使用同一个对象实例作为键时,hashmap不会存储或检索值。我的代码如下

public class Candidate {

    private  String id;
    private  String name;

    public Candidate (String id, String name){
        this.id = id;
        this.name = name;
    }

    public static void main(String args[]){
        Candidate cad = new Candidate("101","hari");

        HashMap<Candidate,String> mp = new HashMap<Candidate,String>();
        mp.put(cad, "sachin");
        mp.put(cad, "shewag");

        for(Candidate cand : mp.keySet()){
            System.out.println(mp.get(cand).toString());
        }
    }
当我尝试获取hashmap的大小时,它只返回一个。这意味着第一次插入hashmap被第二次覆盖


是因为我使用同一个候选实例插入了两个值吗?有可能强制hashmap同时插入两个键和值对吗?

映射背后的整个思想是1)键是唯一的——它只为特定键保留一个键/值对,2)它的查找相对“便宜”

HashMap中只有一个对象。请理解,当您向映射添加另一个键、值对时,如果该键与映射中的上一项相同,则上一项将替换为新项。如果要添加两个或多个项目,请使用不同的键,或创建一个包含对象列表作为其值的贴图。e、 g

HashMap<Candidate, List<String>>

映射背后的整体思想是1)键是唯一的——它只为特定键保留一个键/值对,2)它的查找相对“便宜”

HashMap中只有一个对象。请理解,当您向映射添加另一个键、值对时,如果该键与映射中的上一项相同,则上一项将替换为新项。如果要添加两个或多个项目,请使用不同的键,或创建一个包含对象的
List
作为其值的映射。e、 g

HashMap<Candidate, List<String>>
任用

  • Map
  • 一个很好的第三方替代方案,如谷歌的
    Multimap
使用或

  • Map
  • 一个很好的第三方替代方案,如谷歌的
    Multimap

    • 使用
      java-8有一种更简单的方法,顺便说一句,简化示例:

          HashMap<String, List<String>> mp = new HashMap<>();
      
          List<String> list = Arrays.asList("aa", "aa", "bb", "bb");
      
          for (String s : list) {
              mp.computeIfAbsent(s, k -> new ArrayList<>()).add("c");
          }
      
          System.out.println(mp); // {bb=[c, c], aa=[c, c]}
      
      HashMap mp=新HashMap();
      列表=数组。asList(“aa”、“aa”、“bb”、“bb”);
      用于(字符串s:列表){
      mp.computeIfAbsent(s,k->newArrayList()).add(“c”);
      }
      系统输出打印项次(mp);//{bb=[c,c],aa=[c,c]}
      
      使用
      java-8有一种更简单的方法来做你想做的事,顺便说一句,简化的示例:

          HashMap<String, List<String>> mp = new HashMap<>();
      
          List<String> list = Arrays.asList("aa", "aa", "bb", "bb");
      
          for (String s : list) {
              mp.computeIfAbsent(s, k -> new ArrayList<>()).add("c");
          }
      
          System.out.println(mp); // {bb=[c, c], aa=[c, c]}
      
      HashMap mp=newhashmap();
      列表=数组。asList(“aa”、“aa”、“bb”、“bb”);
      用于(字符串s:列表){
      mp.computeIfAbsent(s,k->newArrayList()).add(“c”);
      }
      系统输出打印项次(mp);//{bb=[c,c],aa=[c,c]}
      
      在旁注中,该演员阵容
      候选者cad=(候选者)obj
      在检查
      obj instanceof Candidate
      之前,似乎有一个
      ClassCastException
      等待发生
      在检查候选对象的
      obj instanceof
      之前,似乎有一个
      ClassCastException
      等待发生。将字符串列表添加到我的映射或创建另一个具有相同值的实例。我知道这个解决方案有效。但是有没有办法在hashmap中用相同的键存储2个值呢?HashCode和equals在散列方面的作用是什么?@user1734698不,这是第一章中的
      HashMap
      的要点place@Eugene:明白了!您在哪里调用
      MyCandidateTest.put()
      ?@HovercraftFullOfEels您可以简化
      put
      以利用java-8的功能,例如:将字符串列表添加到我的映射或创建具有相同值的另一个实例。我知道这个解决方案有效。但是有没有办法在hashmap中用相同的键存储2个值呢?HashCode和equals在散列方面的作用是什么?@user1734698不,这是第一章中的
      HashMap
      的要点place@Eugene:明白了!您在哪里调用
      MyCandidateTest.put()
      ?@HovercraftFullOfEels您可以简化
      put
      以利用java-8的功能,例如:
      public class Candidate {
      
          private String id;
          private String name;
      
          public Candidate(String id, String name) {
              this.id = id;
              this.name = name;
          }
      
          @Override
          public boolean equals(Object obj) {
              // Candidate cad =(Candidate)obj; // !! no
              if (!(obj instanceof Candidate)) {
                  return false;
              }
              Candidate cad = (Candidate) obj; // !! yes
              if (cad.id.equals(this.id) && cad.name.equals(this.name)) {
                  return true;
              }
              return false;
          }
      
          @Override
          public int hashCode() {
              return Objects.hash(id, name);
          }
      }
      
          HashMap<String, List<String>> mp = new HashMap<>();
      
          List<String> list = Arrays.asList("aa", "aa", "bb", "bb");
      
          for (String s : list) {
              mp.computeIfAbsent(s, k -> new ArrayList<>()).add("c");
          }
      
          System.out.println(mp); // {bb=[c, c], aa=[c, c]}