Java equals()方法和==运算符都用于比较对象是否相等。 但是,他们以非常不同的方式进行检查,从而产生不同的结果。

它们之间的主要区别是==检查两个对象是否都指向相同的内存位置,并且equals()求和对象中包含的实际值的比较。
一个示例将为您提供更多线索:
Animal.java
public class Animal {private String name;private int age;public Animal (String n, int a) {this.name = n;this.age = a;}}
EqualsDemo.java
public class EqualsDemo {public static void main(String[] args) {Animal animal1 = new Animal("Vic", 4);Animal animal2 = new Animal("Vic", 4);if (animal1 == animal2)System.out.println("These objects are equal.");elseSystem.out.println("These objects are not equal.");}}
您认为会打印出什么?
输出:
These objects are not equal.
即使两个对象都是同一个类的实例并包含相同的值,但它们并不引用相同的对象。 每当您键入new的关键字时,它都会自动创建一个新的对象引用。 当我们使用new关键字创建两个对象时,即使它们包含相同的值,它们也不相同。 它们指向不同的存储位置。
使用equals()方法和==运算符比较字符串
EqualsDemo.java
public class EqualsDemo {public static void main(String[] args) {String str1 = "First string";String str2 = "First string";if (str1 == str2)System.out.println("Equal");elseSystem.out.println("Not equal");}}
您认为将在屏幕上显示什么?
输出:
Equal
如果您说“等于”,那么您将是正确的。 当字符串包含相同的内容
Not equal
它们指向相同的存储位置。
现在让我们做与上面完全相同的示例,但改用new关键字。
使用new关键字创建相同内容的字符串
EqualsDemo.java
public class EqualsDemo {public static void main(String[] args) {String str1 = new String("First string");String str2 = new String("First string");if (str1 == str2)System.out.println("Equal");elseSystem.out.println("Not equal");}}
您认为现在将打印什么?
输出:
Not equal
如我上面指出的,打印不等于的原因是因为,当您使用new关键字创建对象时,会创建一个指向其自身存储位置的新指针。

这是一个直观的示例。 内存位置刚刚组成。 但是从示例中可以看到,当创建str1和str2时,它们指向不同的内存位置。 因此,当您使用==运算符比较它们时,无论如何,您都会得到假。
覆盖equals()方法以符合条件
假设您要在两个对象上调用.equals(),并且如果它们包含相同的名称和年龄,则应返回true。
Animal.java
public class Animal {private String name;private int age;public Animal (String n, int a) {this.name = n;this.age = a;}public String getName() {return this.name;}public int getAge() {return this.age;}public boolean equals(Animal a) {if (this.name.equals(a.getName()) && this.age == a.getAge())return true;elsereturn false;}}
EqualsDemo.java
public class EqualsDemo {public static void main(String[] args) {Animal animal1 = new Animal("Vic", 4);Animal animal2 = new Animal("Vic", 4);if (animal1.equals(animal2))System.out.println("These objects are equal.");elseSystem.out.println("Not equal");}}
输出:
These objects are equal.
我们在Animal类中重写equals方法,因此它符合我们自己的条件。 如果我们不重写它,而只是对两个对象调用equals方法,它将不会返回true。
在字符串上调用equals()
EqualsDemo.java
public class EqualsDemo {public static void main(String[] args) {String str1 = "str";String str2 = "str";if(str1.equals(str2)) {System.out.println("equal");}else {System.out.println("not equal");}}}
输出
equal
在字符串上调用equals()时,它将检查每个字符是否在两个字符串中都相同。 意思是,比较字符串时应始终使用equals,而不是==。
对使用new关键字创建的字符串的调用equals
EqualsDemo.java
public class EqualsDemo {public static void main(String[] args) {String str1 = new String("str");String str2 = new String("str");if(str1.equals(str2)) {System.out.println("equal");}else {System.out.println("not equal");}}}
输出:
equal
如您所见,使用equals时两个对象(字符串)是否指向不同的存储位置并不重要。 如果两个字符串中的内容相同,则返回true。
结论
比较字符串时,应始终使用.equals()而不是==。
