java中的映射和自定义对象
我正在尝试下面的代码java中的映射和自定义对象,java,hashmap,Java,Hashmap,我正在尝试下面的代码 class dog{ private String name; public dog(String n){ name = n; } public String getname(){ return name; } public void setname(String n){ name =n;} public boolean equals(Object o){ //if (( o instanceo
class dog{
private String name;
public dog(String n){
name = n;
}
public String getname(){ return name; }
public void setname(String n){ name =n;}
public boolean equals(Object o){
//if (( o instanceof dog )&& (((dog)o).name == name)) return true;
if (( o instanceof dog )&& (((dog)o).name.equals(name))) return true;
else return false;
}
public int hashcode(){
return name.length();
}
public String toString(){
return "Name:"+name;
}
}
这是我的狗课。现在,在Main方法中,我尝试执行以下操作
Map<Object,Object> m = new HashMap <Object, Object>();
dog p = new dog("GM");
dog q = new dog ("GM");
System.out.println(p.equals(q));
m.put ( new dog("GM"),"K2");
System.out.println(m.get(new dog("GM")));
Map m=newhashmap();
狗p=新狗(“GM”);
狗q=新狗(“GM”);
系统输出println(p等于(q));
m、 put(新狗(“GM”)、“K2”);
系统输出打印LN(m.get(新狗(“GM”));
我得到一个真值和一个空值。我希望是K2而不是null。有人能帮我吗。我已经重写了hashcode和equals方法。我错过了什么
编辑:-更改等于函数。同样的结果。直接的问题是
hashCode
需要一个大写的C
,您正在用小写的C
实现hashCode
((dog)o).name==name
比较字符串的标识。这意味着如果您有两个字符串实例“GM”
,它们将彼此.equals()
,但不是=
直接的问题是hashCode
需要大写C
,您正在用小写C
实现hashCode
((dog)o).name==name
比较字符串的标识。这意味着如果您有两个字符串实例“GM”
,它们将彼此.equals()
,但不是=
直接的问题是hashCode
需要大写C
,您正在用小写C
实现hashCode
((dog)o).name==name
比较字符串的标识。这意味着如果您有两个字符串实例“GM”
,它们将彼此.equals()
,但不是=
直接的问题是hashCode
需要大写C
,您正在用小写C
实现hashCode
((dog)o).name==name
比较字符串的标识。这意味着,如果您有两个字符串实例“GM”
,它们将彼此.equals()
,但不是=
,那么在equal方法中的dog类中字符串值比较是不正确的。您使用了((dog)o.name==name))。实际上,它应该使用(((dog)o).name.equals(name)。请先更改它,然后进一步检查。更改您的hashCode以返回name.hashCode()
,而不是name.length()
,您正在使用WORST哈希函数中的一个。它不会返回负数,而且很少使用大数。最好应用Java编码约定:1-将类名大写为Dog
而不是Dog
2-将getter和setter方法重命名为getName
和setName
,以便(以及大多数库)可以使用Interpection访问它们。equal方法中dog类中的字符串值比较不正确。您使用了(((dog)o)。name==name))。实际上,它应该使用(((dog)o)。name。equals(name)。请先更改它,然后进一步检查。更改您的哈希代码以返回name.hashCode()
而不是name.length()
,您正在使用WORST哈希函数中的一个。它不会返回负数,而且很少使用大数。最好应用Java编码约定:1-将类名大写为Dog
而不是Dog
2-将getter和setter方法重命名为getName
和setName
,以便(以及大多数库)可以使用Interpection访问它们。equal方法中dog类中的字符串值比较不正确。您使用了(((dog)o)。name==name))。实际上,它应该使用(((dog)o)。name。equals(name)。请先更改它,然后进一步检查。更改您的哈希代码以返回name.hashCode()
而不是name.length()
,您正在使用WORST哈希函数中的一个。它不会返回负数,而且很少使用大数。最好应用Java编码约定:1-将类名大写为Dog
而不是Dog
2-将getter和setter方法重命名为getName
和setName
,以便(以及大多数库)可以使用Interpection访问它们。equal方法中dog类中的字符串值比较不正确。您使用了(((dog)o)。name==name))。实际上,它应该使用(((dog)o)。name。equals(name)。请先更改它,然后进一步检查。更改您的哈希代码以返回name.hashCode()
而不是name.length()
,您正在使用WORST哈希函数中的一个。它不会返回负数,而且很少使用大数。最好应用Java编码约定:1-将类名大写为Dog
而不是Dog
2-将getter和setter方法重命名为getName
和setName
,以便(以及大多数库)可以使用Interpection访问它们。感谢您的输入。但是p.equals(q)正在返回true。这意味着equals方法按预期工作。不是吗?对于字符串,我认为这也可以。如果我错了,请纠正我。事实上,我也尝试过。即使我使用equals而不是==,同样的结果也是错误的。对于字符串,这是不好的;事实上,对于字符串,它最容易混淆pe其他人。有时它有效(查阅“字符串实习”),有时则无效。显然,对你来说,它在println
中有效,但如果它在地图中有效,我们就不会进行讨论。明白了,这花了太长时间。你的意思是你犯了我犯的错误?如果是,请帮忙。啊,非常感谢……愚蠢的错误:)感谢您的输入。但是p.equals(q)返回true。这意味着equals方法按预期工作。不是吗?对于字符串,我认为这很好。如果我错了,请纠正我。事实上,我也尝试过了。即使我使用equals而不是==你错了,结果也是一样的。