代码如下:
public class TestEquals {
public static void main(String[] args) {
int n1 = 1;
int n2 = 1;
String x1 = "xxx";
String x2 = new String("xxx");
String x3 = "xxx";
Student2 s1 =new Student2("张三");
Student2 s2 =new Student2("张三");
Student3 s3 =new Student3("张三");
Student3 s4 =new Student3("张三");
System.out.println(n1 == n2);
System.out.println(x1 == x2);
System.out.println(x1.equals(x2));
System.out.println(x1 == x3);
System.out.println(s1 == s2);
System.out.println(s1.equals(s2));
System.out.println(s3 == s4);
System.out.println(s3.equals(s4));
}
}
class Student2{
private String name;
public Student2(String name) {
this.name = name;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
@Override
public String toString() {
return "Student{" +
"name='" + name +
'}';
}
}
class Student3{
private String name;
public Student3(String name) {
this.name = name;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
@Override
public boolean equals(Object o) {
if (this == o) return true;
if (o == null || getClass() != o.getClass()) return false;
Student3 student3 = (Student3) o;
return name.equals(student3.name);
}
@Override
public int hashCode() {
return Objects.hash(name);
}
}
运算结果:
true
false
true
true
false
false
false
true
解释:
equals和==
的比较,要区分是基本类型还是对象类型
在基本类型中,“==”和equals都是比较值是否相等
在对象类型中,
==
是直接比较地址值是否相等,相等则返回true,否则返回false;
“equals”方法要区分是String类型还是Object类型,
String类对equals方法进行了重写,当地址值相等时直接返回true,如果不等时判断这两个地址上所存放的内容是否相等,如果相等则也返回true,否则返回false;所以会出现第二种和第三种的结果
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;
}
Object类型的话要看对象类是否对equals方法和hashCode方法进行了重写,如果没有的话就是调用父类Object类的equals方法,这时候比较的就是地址值,如果地址值相等的话就返回true,否则返回false,不管两个地址上所存放的内容是否相等,所以会出现第六种和第八种的结果
public boolean equals(Object obj) {
return (this == obj);
}