参考回答: == 和 equals,都是用来比较是否相等的。
其中,== 是比较值是否相等,这里要区分两种情况:
如果要比较的是两个基本数据类型变量,那么要比较的值指的就是具体内容。
int num1 = 10;
int num2 = 10;
// 是对10和10的比较
System.out.println(num1 == num2); // true
如果要比较的是两个引用数据类型变量,那么要比较的值指的就是变量中存储的引用地址值。
Student stu1 = new Student(1, "张三");
Student stu2 = new Student(1, "张三");
// 是对两个变量存储的对象地址值比较,而不是比较1、张三这种内容
System.out.println(stu1 == stu2); // false
equals 方法是定义在 Object 类中的,因为 Java 中所有的类都继承自 Object 类,所以每个 Java 类都有该方法,在 Object 类中这个方法的默认实现就是使用 == 来比较的。
public class Object {
// ...
public boolean equals(Object obj) {
return (this == obj);
}
// ...
}
Student stu1 = new Student(1, "张三");
Student stu2 = new Student(1, "张三");
// 是对两个变量存储的对象地址值比较,而不是比较1、张三这种内容
System.out.println(stu1.equals(stu2)); // false
如果想用 equals 方法来比较两个对象存储的内容,那么对应的类需要重写 equals 方法,像 String 类型之所以可以用 equals 方法来比较存储的字符内容,就是因为它重写了 equals 方法。
public boolean equals(Object anObject) {
// 判断要比较的两者是不是同一个对象
if (this == anObject) {
return true;
}
// 判断要比较的另一方是不是字符串类型
if (anObject instanceof String) {
// 将另一方向下类型转换为字符串类型
String anotherString = (String)anObject;
// 判断两个字符串的长度是不是相等
int n = value.length;
if (n == anotherString.value.length) {
// 获取两个字符串内部的两个字符数组(字符串内部通过字符数组存储内容)
char v1[] = value;
char v2[] = anotherString.value;
// 循环遍历两个字符数组,比较每一个字符
int i = 0;
while (n-- != 0) {
if (v1[i] != v2[i])
return false;
i++;
}
return true;
}
}
return false;
}