覆盖equals和hashcode java

时间:2013-01-24 13:41:44

标签: java override equals

  

可能重复:
  Overriding equals and hashCode in Java

package testpack;

import java.util.HashMap;
import java.util.Iterator;
import java.util.Map;
import java.util.Set;

public class TestEm {

    private String company;
    private int salary;

    TestEm(String company, int salary) {
        this.company = company;
        this.salary = salary;
    }

    public static void main(String[] args) {

        Map<TestEm, String> map = new HashMap<TestEm, String>();
        map.put(new TestEm("abc", 100), "emp1");
        map.put(new TestEm("def", 200), "emp2");
        map.put(new TestEm("ghi", 300), "emp3");

        Set<TestEm> set = map.keySet();
        Iterator<TestEm> it = set.iterator();
        while (it.hasNext()) {
            System.out.println(it.next());
        }
        **System.out.println(map.get(new TestEm("ghi", 300)));**

    }

    @Override
    public boolean equals(Object o) {

        if (o == this)
            return true;
        if (!(o instanceof TestEm))
            return false;

        TestEm te = (TestEm) o;
        return te.company.equals(company) && te.salary == salary;
    }

    @Override
    public int hashCode() {

        int code = 0;

        code = salary * 10;
        return code;
    }

    /*
     * @Override public String toString() {
     * 
     *    return this.company;  }
     */
}

,输出

testpack.TestEm@3e8
testpack.TestEm@7d0
testpack.TestEm@bb8
emp3

嗨,我已经在TestEm类中覆盖了Object类的一些方法,一切正常,但前三个输出正在使用迭代器然后执行SOP而最后一个只是使用SOP,我只是想知道为什么首先三个输出作为对象使用迭代器,第四个输出只是正确的输出作为对应键的值,我没有重写toString()所以前三个输出是正确的但是没有toString()SOP如何显示正确的输出。 / p>

4 个答案:

答案 0 :(得分:3)

迭代器迭代集合中的对象,而

map.get(new TestEm("ghi", 300))

返回与上述键关联的值。该值为"emp3"

答案 1 :(得分:1)

迭代器正在遍历并打印(类:TestEm),而外部的SOP正在检索地图的,对应到密钥TestEm("ghi", 300),恰好是"emp3"(类:String)。它们是不同的对象,因此打印的价值不同。

您应该覆盖toString()中的TestEm,以便更清楚地了解正在发生的事情,例如:

@Override
public String toString() {
    return company + " " + salary;
}

答案 2 :(得分:0)

第四行打印在循环外部,是地图返回的值。

当您覆盖equalshashCode时,您构建的新TestEm对象将被视为与您添加到地图中的最后一个对象相同。

答案 3 :(得分:0)

您正在迭代键,而不是遍历值。