Как сравнить 2 логических объекта в Java - PullRequest
0 голосов
/ 07 апреля 2020

Я пытаюсь сравнить, если два логических значения имеют одно и то же значение logi c, но код работает, только если я сравниваю один и тот же объект, для следующего кода вывод будет ложным, и я не понимаю, почему:


public class Logic {
    private boolean bo;
    public Logic(boolean bo) {
        this.bo=bo;
    }

    public boolean equals(Object obj) {
        if (this==obj)
            return true;
        else
            return false;
    }
    public static void main(String[] args) {
        Logic l1,l2;
        l1=new Logic(true);
        l2=new Logic (true);
        System.out.println(l1.equals(l2));

    }

}

Ответы [ 4 ]

1 голос
/ 07 апреля 2020

Вы сравниваете объекты, а не атрибуты в вашем методе equals. Правильный путь будет:

public boolean equals(Logic obj) {
     return this.bo==obj.bo;
}
0 голосов
/ 07 апреля 2020

Как вы знаете, новые объекты всегда создаются в пространстве кучи, а ссылки на эти объекты хранятся в памяти стека. Когда вы сравниваете два объекта, используя ==, он проверяет, указывают ли их ссылки на один и тот же объект или нет? Он не проверяет содержимое объектов. Используя вашу реализацию метода 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;
  }

0 голосов
/ 07 апреля 2020
  1. Когда вы создаете объект с помощью new, в качестве примера l1 будет иметь ссылочный адрес в стеке, который отличается от объекта в куче, чем l2.
  2. Вы не должны сравнивать Object таким образом, если вам нужен Boxed Object, такой как Ingeter, Boolean и др. c. Правильный подход к распаковке, как показано ниже:

    Boolean b1 = new .., Boolean b2 = new ...; логическое bb1 = b1; логическое bb2 = b2; Теперь сравните между bb1 и bb2;

0 голосов
/ 07 апреля 2020

Вы можете использовать этот

// метод сравнения () логического класса

класса GeeksforGeeks {

// Driver method 
public static void main(String[] args) 
{ 

    // first value 
    boolean a = true; 

    // second value 
    boolean b = true; 

    // compare method 
    System.out.println(a + " comparing with " + b 
                       + " = " + Boolean.compare(a, b)); 
} 

}

или проверьте эту ссылку введите описание ссылки здесь

...