如何在Java中比较两个布尔对象

huangapple go评论130阅读模式
英文:

How to compare 2 boolean objects in Java

问题

我正在尝试比较两个布尔值是否具有相同的逻辑值,但只有在比较相同对象时,代码才能正常工作。对于以下代码,输出将为false,我不明白为什么:

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));
    }
}
英文:

I am trying to compare if two boolean values have the same logic value, but the code works only if I compare the same object,for the following code the output will be false and I don't understand why:


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));

	}

}

答案1

得分: 1

你在你的 equals 方法中进行的是对象比较,而不是属性比较。正确的方式应该是:

public boolean equals(Logic obj) {
    return this.bo == obj.bo;
}
英文:

You are comparing the objects not the attributes in your equals method. The right way would be:

public boolean equals(Logic obj) {
     return this.bo==obj.bo;
}

答案2

得分: 0

以下是您要翻译的代码部分:

// Boolean类的compare()方法

class GeeksforGeeks {

    // 主方法
    public static void main(String[] args)
    {

        // 第一个值
        boolean a = true;

        // 第二个值
        boolean b = true;

        // 比较方法
        System.out.println(a + " 与 " + b
                           + " 比较结果 = " + Boolean.compare(a, b));
    }
}

或者查看此链接 链接说明在这里

英文:

you can to use this

// compare() method of Boolean class

class 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)); 
} 

}

or check this link enter link description here

答案3

得分: 0

  1. 当您使用new关键字创建对象时,例如l1,它在堆栈中会有一个引用地址,在堆中与l2引用的对象不同。
  2. 如果您需要比较类似于Integer、Boolean等装箱对象,就不应该像那样进行比较。正确的方法是进行拆箱,如下所示:
Boolean b1 = new ... Boolean b2 = new ...;
boolean bb1 = b1;
boolean bb2 = b2;
现在在bb1和bb2之间进行比较;
英文:
  1. When you create the object by using new, as an example l1 would have a reference address in stack which is different object in the heap than l2.

  2. You should not compare Object like that if you need Boxed Object like Ingeter, Boolean and etc. Right approach to do that unbox it, like below:

    Boolean b1 =new .., Boolean b2=new ...;
    boolean bb1=b1;
    boolean bb2=b2;
    Now compare between bb1 and bb2;

答案4

得分: 0

如你所知,新对象总是在堆空间中创建,并且对这些对象的引用存储在堆栈内存中。当你使用 == 操作符比较两个对象时,它会检查它们的引用是否指向相同的对象?它不会检查对象的内容。

使用你提供的 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

因为 l1l2 指向不同的对象,但是 l1l3 指向堆中的同一个对象。
我们应该重写 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;
  }
英文:

As you know new objects are always created in heap space and the references to these objects are stored in stack memory. When you compare two objects using == it checks if their reference are point to the same object or not? It doesn't check objects content.
Using your implementation of equal method (comparing object using ==), the output of running:

    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));
    }

would be:

false
true

Because l1 and l2 point to different objects but l1 and l3 point to a same object in heap.
We should override equals method so that it compares equality of contents. According to the Java Language Specification, there is a contract between equals(Object) and hashCode():

> If two objects are equal according to the equals(Object) method, then
> calling the hashCode method on each of the two objects must produce
> the same integer result.

With these in mind we can override equals(Object obj) and hashCode() like this:

  @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;
  }

huangapple
  • 本文由 发表于 2020年4月7日 23:14:10
  • 转载请务必保留本文链接:https://go.coder-hub.com/61083357.html
匿名

发表评论

匿名网友

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen:

确定