重写了equals和hashcode方法之后也不能 保证contains方法一定生效,看下下面的代码全部能答对输出的估计很少。同一个对象如果修改了之后很可能contains就为false了,平时还是应该对常用容器的源码好好看看。
import java.util.HashSet;
import java.util.Objects;
import java.util.Set;
public class HashContainsTest
{
public static void main(String[] args)
{
String sub = "elementSub";
Element element = new Element();
Set<Element> set = new HashSet<>();
set.add(element);
element.setSub(sub);
System.out.println("contains element ? "+set.contains(element)); //false 修改后hashcode变化导致set不认为contains
Element element2 = new Element();
element2.setSub(sub);
System.out.println("equals element2 ? "+element.equals(element2)); //true 重写了equals
System.out.println("hashcode == element2 ? "+ (element.hashCode()== element2.hashCode()));//true 重写了hashcode
System.out.println("contains element2 ? "+set.contains(element2));//false 虽然equals但是和element被add到set中的时候的hashcode不一样,set不认为contains
set.add(element);
System.out.println("contains element2 ? "+set.contains(element2));
}
}
class Element {
Object sub = null;
public Object getSub()
{
return sub;
}
public void setSub(Object sub)
{
this.sub = sub;
}
@Override
public int hashCode()
{
return Objects.hash(sub);
}
@Override
public boolean equals(Object obj)
{
if(this==obj) {
return true;
}
return this.hashCode()==obj.hashCode();
}
}
输出:
contains element ? false // 修改对象导致hashcode不相等了
equals element2 ? true
hashcode == element2 ? true
contains element2 ? false
contains element2 ? true