class Student2{
int age;
String name;
Student2(int age,String name)
{
this.age=age;
this.name=name;
}
/*
public int hashCode(){
return age;
}
*/
public boolean equals(Object o){
Student2 s2=(Student2)o;
return (this.age==s2.age && this.name==s2.name);
}
}
public class HashMapDemo{
public static void main(String a[])
{ Map m=new HashMap();
m.put(new Student2(10,"sameer"), 1);
m.put(new Student2(11,"pagal"), 2);
m.put(new Student2(12,"ullu"), 3);
m.put(new Student2(13,"lullu"), 5);
System.out.println(m.get(new Student2(11,"pagal")));
}
}
HashMap ...这里得到null,我要重载hashcode()以便我的各自对象。 我要在hashCode中添加什么。 我怀疑是在hashCode方法中是否必须覆盖hashCode方法。
答案 0 :(得分:2)
如果要将类用作键,则需要hashCode和equals方法。让你的IDE生成或使用:
@Override
public int hashCode() {
final int prime = 31;
int result = 1;
result = prime * result + age;
result = prime * result + ( ( name == null ) ? 0 : name.hashCode() );
return result;
}
@Override
public boolean equals( Object obj ) {
if( this == obj )
return true;
if( obj == null )
return false;
if( getClass() != obj.getClass() )
return false;
Student2 other = (Student2) obj;
if( age != other.age )
return false;
if( name == null ) {
if( other.name != null )
return false;
} else if( !name.equals( other.name ) )
return false;
return true;
}
答案 1 :(得分:1)
在你的" System.out.println"你要求获得你正在创建的元素。这个元素我具有相同的属性,就像你要搜索的那个,但它是一个新属性。因此他无法找到它。 您必须要求已插入的对象。但为此,你必须指定你想要的那个。
修改你的代码,如:
Student2 myStud = new Student2(11,"pagal");
m.put(myStud, 2);
...
System.out.println(m.get(myStud));
答案 2 :(得分:1)
如果你不覆盖hashcode()
方法,那么将使用默认的Object.hashcode()
方法,即使对象的类型相同,也可能为每个实例返回不同的哈希码。相同的字段值。
如果您取消注释哈希码方法,那么您应该这次获得所需的结果。但是,您的hashcode()
和equals()
方法存在一些缺陷。
在您的equals方法中,您使用==
检查字符串的相等性,这是您不应该做的。请使用.equals()
来比较字符串。这只会起作用,因为您对字符串进行了硬编码,因此编译器恰好会为"pagal"
使用相同的实例。
您的hashcode()
和equals()
方法都应检查相同的字段。您的hashcode()
方法仅使用age
,但您的等号同时使用age
和name
。将您的等号更改为仅使用age
或更改hashcode()
以同时使用age
和name
。
有关如何正确实施equals()
和hashcode()
的更多信息,请阅读“有效Java”一书或查看此IBM java development link
答案 3 :(得分:1)
在HashMap中用作Student2
时,必须覆盖key
类中的hashcode()和equals()方法。
检查文档here
Object类定义的hashCode方法确实为不同的对象返回不同的整数。这通常通过将对象的内部地址转换为整数并且来实现,因此您将收到空。
答案 4 :(得分:1)
在这种情况下,您必须覆盖hashcode
。
如果两个对象通过相等的方法相等,那么它应该具有相同的哈希码。这就是哈希映射的工作方式
public int hashCode(){
return age;
}
我认为这适用于您的情况。 但如果你有很多同龄的学生,它会默默地降低表现。因为哈希桶越来越大了。所以尝试放一些有效的哈希码