HashMap ...这里得到null,我要重载hashcode()以便我的各自对象

时间:2015-07-01 12:49:23

标签: java hashmap

    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方法。

5 个答案:

答案 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()方法存在一些缺陷。

  1. 在您的equals方法中,您使用==检查字符串的相等性,这是您不应该做的。请使用.equals()来比较字符串。这只会起作用,因为您对字符串进行了硬编码,因此编译器恰好会为"pagal"使用相同的实例。

  2. 您的hashcode()equals()方法都应检查相同的字段。您的hashcode()方法仅使用age,但您的等号同时使用agename。将您的等号更改为仅使用age或更改hashcode()以同时使用agename

  3. 有关如何正确实施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;     
        }

我认为这适用于您的情况。 但如果你有很多同龄的学生,它会默默地降低表现。因为哈希桶越来越大了。所以尝试放一些有效的哈希码