Java equals()方法示例
Java equals()方法和“==”运算符都用于比较对象的相等性。然而,他们以一种非常不同的方式进行检查,产生不同的结果。
它们之间的主要区别是“==”检查两个对象是否指向同一个内存位置,equals()计算结果与对象中包含的实际值的比较。
举个例子会给你更多的线索:
动物.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."); else System.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"); else System.out.println("Not equal"); } }
你觉得屏幕上会印什么?
输出
Equal
如果你说相等,那你就对了。当字符串包含相同的cont时
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"); else System.out.println("Not equal"); } }
你觉得现在会印什么?
**输出
**
Not equal
不相等之所以被打印出来是因为,正如我前面所指出的,当我们使用 new关键字创建对象时,我们将创建一个指向其自身内存位置的新指针。
这是一个直观的例子。记忆的位置是刚刚组成的。但是从这个例子中可以看出,当str1被创建和str2被创建时,它们指向不同的内存位置。因此,当你使用==运算符来比较它们时,不管怎样都会得到false。
重写equals()方法以匹配条件
假设我们想对两个对象调用.equals(),如果它们包含相同的名称和年龄,它应该返回true。
动物.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; else return 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."); else System.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],而不是 ==。
对使用新关键字创建的字符串调用等于
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()和not==。