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而不是==你错了,结果也是一样的。