首先看 ‘==’
1.当比较的是对象的引用时,主要是判断两个引用所指的对象在堆内存中的存放地址是否一致;但比较其他的数据类型时,则比较的是两者的值是否相等;
代码如下:
public class JavaEquals {
public static void main(String[] args) {
String a = "abc";
String b = "abc";
System.out.println("a == b: " + (a == b));
int a2 = 1;
int b2 = 1;
System.out.println("a2 == b2: " + (a2 == b2));
Integer a3 = 127;
Integer b3 = 127;
System.out.println("a3 == b3: " + (a3 == b3));
// 比较两个对象的引用
Student s1 = new Student();
Student s2 = new Student();
System.out.println("s1 == s2: " + (s1 == s2)); // false(两对象在堆内存中的地址不一样)
}
}
结果:
注意:当用 ‘==’ 比较Integer类型且值相等的两个数它们的范围在-128 到 127之间时返回的是同一个对象,当不在该范围时则各自new一个对象返回所以对象地址会不一样即使值一样,代码如下:
public class JavaEquals {
public static void main(String[] args) {
Integer a2 = 100;
Integer b2 = 100;
System.out.println(a2 == b2);
Integer a3 = 129;
Integer b3 = 129;
System.out.println(a3 == b3);
}
}
结果:
接着看:‘equals’
‘equals’ 是Object类内的一个方法,用于比较两个对象是否相等,默认Object类的equals方法是比较两个对象的地址,跟==的结果一样。Object的equals方法如下:
public boolean equals(Object obj) {
return (this == obj);
}
基本数据类型比较时不能调用equals方法
1.若比较的是String或八种基本数据类型的包装类时,也是比较两者的值是否相等,因为它们重写了 ‘equals’ 方法(java中所有的累默认继承Object类)
代码示例:
public class JavaEquals {
public static void main(String[] args) {
String a = "abc";
String b = "abc";
System.out.println(a.equals(b));
Integer a3 = 127;
Integer b3 = 127;
System.out.println(a3.equals(b3));
}
}
结果:
2.当比较对象的引用时,若重写了equals方法则比较的是两者的内容是否相等,若没有重写该方法则默认调用父类(Object类)的equals方法,作用和 “==” 一样比较的是两个对象的地址是否一样;
代码如下:
public class JavaEquals {
public static void main(String[] args) {
// 比较对象的引用
String a = new String("abc");
String b = new String("abc");
System.out.println(a.equals(b));
Integer a3 = new Integer(127);
Integer b3 = new Integer(127);
System.out.println(a3.equals(b3));
// 实例化自定义的类(没有重写equals方法)
Student s1 = new Student();
Student s2 = new Student();
System.out.println(s1.equals(s2));
}
}
结果:
String类型重写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;
}
Integer类型重写equals方法的源码如下:
public boolean equals(Object obj) {
if (obj instanceof Integer) {
return value == ((Integer)obj).intValue();
}
return false;
}