Как вы знаете, новые объекты всегда создаются в пространстве кучи, а ссылки на эти объекты хранятся в памяти стека. Когда вы сравниваете два объекта, используя ==
, он проверяет, указывают ли их ссылки на один и тот же объект или нет? Он не проверяет содержимое объектов. Используя вашу реализацию метода equal
(сравнение объекта с использованием ==
), результат работы:
public static void main(String[] args) {
Logic l1, l2, l3;
l1 = new Logic(true);
l2 = new Logic(true);
l3 = l1;
System.out.println(l1.equals(l2));
System.out.println(l1.equals(l3));
}
будет:
false
true
, поскольку l1
и l2
указывают на разные объекты, но l1
и l3
указывают на один и тот же объект в куче. Мы должны переопределить метод equals
, чтобы он сравнивал равенство содержимого. Согласно спецификации языка Java, между equals (Object) и hashCode () существует контракт:
Если два объекта равны в соответствии с методом equals (Object), то вызывается hashCode Метод для каждого из двух объектов должен давать один и тот же целочисленный результат.
Имея это в виду, мы можем переопределить equals(Object obj)
и hashCode()
следующим образом:
@Override
public int hashCode() {
return Boolean.hashCode(bo);
}
@Override
public boolean equals(Object obj) {
if (obj == null) {
return false;
}
if (this.getClass() == obj.getClass()) {
return bo == ((Logic) obj).boValue();
}
return false;
}
private boolean boValue() {
return bo;
}