请在Hashset中澄清我的疑问。考虑以下代码,
class Person { String name; Person(String n) { name=n; } public String getName() { return name; } @Override public boolean equals(Object arg0) { System.out.println("in equals"); Person obj=(Person)arg0; System.out.println("1st "+getName()); System.out.println("2nd "+obj.getName()); if(this.getName().equals(obj.getName())) { return true; } return false; } @Override public int hashCode() { System.out.println("in hash code"); System.out.println(" value is "+Integer.valueOf(name.charAt(0))); return Integer.valueOf(name.charAt(0)); } }
在主要我有以下代码
Person obj1=new Person("bcd"); Person obj2=new Person("cde"); Person obj3=new Person("abc"); Person obj4=new Person("abc");
现在,如果我将这些对象添加到哈希集中
Set<Person> sset=new HashSet<Person>(); sset.add(obj1); sset.add(obj4); sset.add(obj2); sset.add(obj3);
我得到这个输出
in hash code value is 98 in hash code value is 97 in hash code value is 99 in hash code value is 97 in equals 1st abc 2nd abc
问题1 :为什么equals()函数仅被调用一次以检查obj3和obj4?为什么不检查其余对象?
问题2 :如果答案是因为它们都具有相同的哈希码,则仅将调用equals,那么为什么下面的代码不调用equals
sset.add(obj1); sset.add(obj4); sset.add(obj2); sset.add(obj4);
输出是:
in hash code value is 98 in hash code value is 97 in hash code value is 99 in hash code value is 97
即使将两个相同的对象添加到具有相同哈希码的哈希集中,也不会进入equals()方法。
问题3 :我迭代了上面的值并打印了内容,但是没有调用哈希码或相等值。什么时候重写哈希码和equals方法真的有用吗?
问题4 :什么时候会hashCode()和equals()被称为?
hashCode()
equals()
equals
hashCode
(obj1 == obj2)