HashSet包含方法,奇怪的行为

Abb*_*don 7 java

这是我的代码:

public class testGui {



    public static void main(String[] arg){
        class TESTS{
            String t;

            public TESTS(String t){
                this.t = t;
            }

            @Override
            public boolean equals(Object x){
                System.out.println("My method is called...");
                if(x instanceof TESTS){
                    TESTS zzz = (TESTS) x;
                    return zzz.t.compareTo(t)==0;
                }
                else return false;
            }
        }
        HashSet<TESTS> allItems = new HashSet<TESTS>();
        allItems.add(new TESTS("a"));
        allItems.add(new TESTS("a"));
        System.out.println(allItems.contains(new TESTS("a")));
    }

}
Run Code Online (Sandbox Code Playgroud)

我不明白为什么hashset包含的方法不是调用我们的规范中提到的equals方法:

更正式地,如果此set不包含元素e,则将指定的元素o添加到此set中(o == null?e == null:o.equals(e))

我的代码返回false而不是进入我的equals方法.

非常感谢您的回答!

Mat*_*hen 13

覆盖时equals,您还必须覆盖hashCode.否则,相等的对象将具有不同的哈希码并被视为不相等.

强烈建议不要 覆盖hashCode.但这并不重要,因为不等对象可以具有相同的哈希码.

  • 他们不会被视为不平等.只是HashSet甚至不会调用equals方法,因为它只对通向同一个桶的hashCodes执行此操作.并且只覆盖hashCode没有任何意义,因为HashSet将始终为具有相同hashcode的对象调用equals. (2认同)

rah*_*hul 7

HashSet取决于每个对象的HashCode.在调用equals方法之前,将调用hashCode方法.如果哈希码相等,则hashset认为值得评估equals方法.

实现一个哈希码方法,如果a.equals(b)== true,那么a.hashCode()== b.hashCode()

它应该像你期望的那样开始工作.