1

重複の可能性:
Java で equals と hashCode をオーバーライドする

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 クラスのいくつかのメソッドをオーバーライドしました。すべて問題ありませんが、最初の 3 つの出力は iterator を使用してから SOP を実行しており、最後の出力は単に SOP を使用しています。最初の 3 つの出力がなぜなのか知りたいだけですイテレータを使用してオブジェクトとして来て、4番目のものは単にキーに対応する値として正しい出力です.toString()をオーバーライドしていないので、最初の3つの出力は正しいですが、toString()なしでSOPがどのように正しい出力を示しているか.

4

4 に答える 4

3

反復子はセット内のオブジェクトを反復処理しますが、

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

上記のキーに関連付けられた値を返します。その値は"emp3".

于 2013-01-24T13:43:38.400 に答える
1

イテレータはキー(クラス: ) をトラバースして出力しますTestEmが、外側の SOP はキー (クラス: ) に対応するマップの値を取得しています。それらは異なるオブジェクトであるため、出力される値は異なります。TestEm("ghi", 300)"emp3"String

何が起こっているのかをより明確に確認するには、次のようにオーバーライドする必要がありますtoString()TestEm

@Override
public String toString() {
    return company + " " + salary;
}
于 2013-01-24T13:46:20.557 に答える
0

値ではなく、キーを反復処理しています。

于 2013-01-24T13:46:18.457 に答える
0

4 行目はループの外側に出力され、マップから返された値です。

と をオーバーライドequalshashCodeたため、作成した新しいTestEmオブジェクトは、最後にマップに追加したオブジェクトと同じと見なされます。

于 2013-01-24T13:44:23.377 に答える