Java equals()方法示例

时间:2020-02-23 14:37:08  来源:igfitidea点击:

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==。