将两个对象与.equals()和==运算符进行比较

我用一个String字段构造了一个类。 然后我创build了两个对象,我必须使用==运算符和.equals()来比较它们。 以下是我所做的:

 public class MyClass { String a; public MyClass(String ab) { a = ab; } public boolean equals(Object object2) { if(a == object2) { return true; } else return false; } public boolean equals2(Object object2) { if(a.equals(object2)) { return true; } else return false; } public static void main(String[] args) { MyClass object1 = new MyClass("test"); MyClass object2 = new MyClass("test"); object1.equals(object2); System.out.println(object1.equals(object2)); object1.equals2(object2); System.out.println(object1.equals2(object2)); } } 

编译后显示两次false。 为什么这两个对象有相同的字段是错误的 – “testing”?

==比较对象引用,它检查两个操作数是否指向同一个对象(不等价的对象, 同一个对象)。

如果要比较string(以查看它们是否包含相同的字符),则需要使用equals比较string。

在你的情况下,如果MyClass两个实例真的被认为是相等的,如果string匹配,那么:

 public boolean equals(Object object2) { return object2 instanceof MyClass && a.equals(((MyClass)object2).a); } 

…但是通常如果你正在定义一个类,那么比单个字段(在这个例子中就是一个)的等价性还要多。


注意:如果你重写equals ,你几乎总是需要重写hashCode 。 正如它在equals JavaDoc中所说:

请注意,无论何时重写此方法,通常都必须重写hashCode方法,以维护hashCode方法的一般约定,该方法声明相等的对象必须具有相同的哈希码。

你应该重写equals

  public boolean equals (Object obj) { if (this==obj) return true; if (this == null) return false; if (this.getClass() != obj.getClass()) return false; // Class name is Employ & have lastname Employe emp = (Employee) obj ; return this.lastname.equals(emp.getlastname()); } 

它看起来像equals2只是调用equals ,所以它会给出相同的结果。

您的equals2()方法总是会返回相同的equals()

你的代码与我的意见:

 public boolean equals2(Object object2) { // equals2 method if(a.equals(object2)) { // if equals() method returns true return true; // return true } else return false; // if equals() method returns false, also return false } 

覆盖函数equals()是错误的。 对象“a”是String类的一个实例,“object2”是MyClass类的一个实例。 他们是不同的class级,所以答案是“错误的”。

比较两个对象的最好方法是将它们转换成jsonstring并比较string,这是处理复杂的嵌套对象,字段和/或包含数组的对象时最容易的解决scheme。

样品:

 import com.google.gson.Gson; Object a = // ...; Object b = //...; String objectString1 = new Gson().toJson(a); String objectString2 = new Gson().toJson(b); if(objectString1.equals(objectString2)){ //do this } 

语句a == object2a.equals(object2)都将始终返回false因为astringobject2MyClass的实例

object.equals的返回types已经是布尔值。 没有必要用分支的方法来包装它。 所以如果你想比较2个对象,只需比较它们:

 boolean b = objectA.equals(objectB); 

b已经是真的还是假的。

当我们使用==时,比较对象的引用而不是实际的对象。 我们需要重写equals方法来比较Java对象。

一些额外的信息C + +运算符超载加载和Java不提供运算符超载。 在Java中的其他可能性是实现比较接口,它定义了一个compareTo方法。

比较器接口也用于比较两个对象

您的实施必须如下:

 public boolean equals2(Object object2) { if(a.equals(object2.a)) { return true; } else return false; } 

有了这个实现你的两个方法将工作。

您的类可能会实现Comparable接口来实现相同的function。 你的类应该实现在接口中声明的compareTo()方法。

 public class MyClass implements Comparable<MyClass>{ String a; public MyClass(String ab){ a = ab; } // returns an int not a boolean public int compareTo(MyClass someMyClass){ /* The String class implements a compareTo method, returning a 0 if the two strings are identical, instead of a boolean. Since 'a' is a string, it has the compareTo method which we call in MyClass's compareTo method. */ if(this.a.compareTo(someMyClass.a) == 0) return 0; return 1; } public static void main(String[] args){ MyClass object1 = new MyClass("test"); MyClass object2 = new MyClass("test"); if(object1.compareTo(object2) == 0){ System.out.println("true"); } else{ System.out.println("false"); } } } 

仅当两个引用指向内存中的同一对象时,“==”运算符才返回true。 另一方面,equals()方法根据对象的内容返回true。

例:

 String personalLoan = new String("cheap personal loans"); String homeLoan = new String("cheap personal loans"); //since two strings are different object result should be false boolean result = personalLoan == homeLoan; System.out.println("Comparing two strings with == operator: " + result); //since strings contains same content , equals() should return true result = personalLoan.equals(homeLoan); System.out.println("Comparing two Strings with same content using equals method: " + result); homeLoan = personalLoan; //since both homeLoan and personalLoand reference variable are pointing to same object //"==" should return true result = (personalLoan == homeLoan); System.out.println("Comparing two reference pointing to same String with == operator: " + result); 

输出:使用==运算符比较两个string:false使用equals方法比较具有相同内容的两个string:true将指向相同String的两个引用与==运算符比较:true

您也可以从链接中获得更多详细信息: http : //javarevisited.blogspot.in/2012/12/difference-between-equals-method-and-equality-operator-java.html?m=1

这里的输出将是假的,在第一个sopln语句中,你试图将Myclasstypes的stringtypesvariables与另一个MyClasstypes进行比较,因为两者都是对象types,并且你已经使用了“==”运算符将检查保存实际内存的引用variables值,而不是内存中的实际内存。 在第二个sopln也是一样的,你再次调用a.equals(object2)其中a是一个可变的内部object1。 请让我知道你的发现。

在下面的代码中,您正在调用overriden方法.equals()。

public boolean equals2(Object object2){if(a.equals(object2)){//在这里你正在调用overriden方法,这就是为什么你得到错误的2倍。 返回true; }否则返回false; }