Java HashMap即使在重写hashcode&;之后也不会同时检索这两个值;对于同一对象等于
我知道这个问题相当业余,但我很难理解为什么当我使用同一个对象实例作为键时,hashmap不会存储或检索值。我的代码如下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
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]}