将对象添加到hashmap作为仅等于实现的方法的键

时间:2015-05-14 09:57:28

标签: java hashmap

我有下面的类,只有等于被覆盖,

class S {

    String txt = null;

    S(String i) {
        txt = i;
    }       

    public boolean equals(Object o) {
        S cc = (S) o;
        if (this.txt.equals(cc.txt)) {
            return true;
        } else {
            return false;
        }
    }

    //Default hash code will be called
    /*public int hashCode(){
        return txt.hashCode();
    }*/

}

我将这个类对象添加到哈希映射中,如下所示

    public static void main(String args[]) {
            S s1 = new S("a");
            S s2 = new S("b");
            S s3 = new S("a");

            Map m = new HashMap();
            m.put(s1, "v11");
            m.put(s2, "v22");
            m.put(s3, "v33");

            System.out.println(m.size());
            System.out.println(m.get(s1));
    }

可以解释结果3和v11打印?不应将s1的值v11替换为v33,因为相同的等号键被置为s3?

2 个答案:

答案 0 :(得分:4)

您也必须覆盖tar -zcvPf /root/"$MYMODIFYDIR"_"$MYMODIFYFILENAME".tar.gz "$file" 。如果hashCodea.equals(b)必须等于a.hashCode()b.hashCode()的实现确定了条目将存储在哪个桶中。如果您不覆盖hashCode,则可能有两个相同的密钥存储在两个不同的存储桶中。

将此添加到您的hashCode课程:

S

答案 1 :(得分:1)

您描述的情况违反了合同。如果您以违反equals()合同的方式覆盖hashCode(),,则必须覆盖hashCode()