Сравните два объекта с операторами .equals() и ==
Я построил класс с одним полем String
. Затем я создал два объекта, и мне нужно их сравнить с помощью оператора ==
и .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. Почему это неверно, если два объекта имеют одинаковые поля - "test"?
Ответы
Ответ 1
==
сравнивает ссылки на объекты, проверяет, указывают ли эти два операнда на один и тот же объект (не эквивалентные объекты, тот же объект).
Если вы хотите сравнить строки (чтобы увидеть, содержат ли они одни и те же символы), вам нужно сравнить строки с помощью equals
.
В вашем случае, если два экземпляра MyClass
действительно считаются равными, если строки совпадают, то:
public boolean equals(Object object2) {
return object2 instanceof MyClass && a.equals(((MyClass)object2).a);
}
... но обычно, если вы определяете класс, там больше эквивалентности, чем эквивалентность одного поля (a
в этом случае).
Боковое примечание: если вы переопределяете equals
, вы почти всегда должны переопределять hashCode
. Как говорится в equals
JavaDoc:
Обратите внимание, что обычно необходимо переопределять метод hashCode
всякий раз, когда этот метод переопределяется, чтобы поддерживать общий контракт для метода hashCode
, который утверждает, что равные объекты должны иметь одинаковые хэш-коды.
Ответ 2
вы должны переопределить 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());
}
Ответ 3
Похоже, что equals2
просто вызывает equals
, поэтому он даст те же результаты.
Ответ 4
Ваш метод 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
}
Ответ 5
Функция перезаписи equals() неверна.
Объект "a" является экземпляром класса String, а "object2" - это экземпляр класса MyClass. Это разные классы, поэтому ответ "ложь".
Ответ 6
Лучший способ сравнить 2 объекта - это преобразовать их в строки json и сравнить строки, это самое простое решение при работе со сложными вложенными объектами, полями и/или объектами, содержащими массивы.
Пример:
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
}
Ответ 7
Заявления a == object2
и a.equals(object2)
оба всегда будут возвращать false
, потому что a
является string
, а object2
является экземпляром MyClass
Ответ 8
Ваша реализация должна понравиться:
public boolean equals2(Object object2) {
if(a.equals(object2.a)) {
return true;
}
else return false;
}
С помощью этой реализации ваши оба метода будут работать.
Ответ 9
Ваш класс может реализовать интерфейс Comparable для достижения той же функциональности. Ваш класс должен реализовывать метод 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 compareTo method.
*/
return this.a.compareTo(someMyClass.a);
}
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");
}
}
}
Ответ 10
Оператор "==" возвращает 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 personalLoan 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);
Вывод: Сравнение двух строк с оператором ==: false Сравнение двух строк с одинаковым содержимым с использованием метода equals: true Сравнение двух ссылок на одну строку с оператором ==: true
Вы также можете получить более подробную информацию по ссылке: http://javarevisited.blogspot.in/2012/12/difference-between-equals-method-and-equality-operator-java.html?m=1
Ответ 11
Если вам не нужно настраивать функцию toString() по умолчанию, другой способ - переопределить метод toString(), который возвращает все сравниваемые атрибуты. затем сравните вывод toString() двух объектов. Я сгенерировал метод toString(), используя IntelliJ IDEA IDE, который включает в себя имя класса в строке.
public class Greeting {
private String greeting;
@Override
public boolean equals(Object obj) {
if (this == obj) return true;
return this.toString().equals(obj.toString());
}
@Override
public String toString() {
return "Greeting{" +
"greeting='" + greeting + '\'' +
'}';
}
}
Ответ 12
возвращаемый тип object.equals уже имеет значение boolean.
нет необходимости обертывать его методом с ветвями. поэтому, если вы хотите сравнить 2 объекта, просто сравните их:
boolean b = objectA.equals(objectB);
b уже имеет значение true или false.
Ответ 13
Когда мы используем ==, ссылка объекта сравнивается не с фактическими объектами. Нам нужно переопределить метод equals для сравнения объектов Java.
Некоторая дополнительная информация. C++ имеет оператор с загрузкой, а Java не предоставляет оператора по загрузке.
Также в java реализованы другие возможности Compare Interface., Который определяет метод compareTo.
Интерфейс компаратора также используется для сравнения двух объектов
Ответ 14
Здесь вывод будет ложным, false beacuse в первом операторе sopln, который вы пытаетесь сравнить с типом типа строки типа Myclass с другим типом MyClass, и это разрешит, поскольку оба типа объекта, и вы использовали "==" oprerator", который будет проверять значение ссылочной переменной, сохраняя фактическую память, а не фактические контуры внутри памяти.
Во втором sopln также это то же самое, что и вы снова вызываете a.equals(object2), где a является varible внутри object1. Дайте мне знать ваши выводы по этому поводу.
Ответ 15
В приведенном ниже коде вы вызываете метод override.equals().
public boolean equals2 (Object object2) { if (a.equals(object2)) {//здесь вы вызываете метод overriden, поэтому вы получаете false 2 раза. return true; } else возвращает false;
}
Ответ 16
/** Comparing two or more variables. Here the two items are compared and it will return a boolean true or false.
*
* @return equals
*/
public boolean equals(Object item)
{
String emp1 = this.toString();
String emp2 = item.toString();
return emp1.equals(emp2);
}
@Override
//In case you have more than one variable.
public String toString()
{
return a + b;
}
// a and b represent the variables to display.