“equals”
基本数据类型:没有equal方法;
引用数据类型:由于String,八种基本数据类型的包装类都覆写了equals方法,因此equals比较的是内容;其他引用数据类型如果没有覆写equals方法,则判断是否指向同一个引用。
“==”
基本数据类型:判断值是否相等;
引用数据类型:判断是否指向同一个引用。
下面来看示例代码:
/**
* 测试equals和== 的区别
*/
public class verify1 {
verify1() {
}
public static void main(String[] args) {
//基本数据类型:“==” 比较值
int a = 1;
int b = 1;
System.out.println(a == b);//true 值相等
//基本数据类型的包装类:“==” 比较引用
Integer A = new Integer(1);
Integer B = new Integer(1);
Integer C = new Integer(2);
System.out.println(A == B);//false 地址不相等,没有指向同一个引用
System.out.println(A == C);//false 地址不相等,没有指向同一个引用
//基本数据类型的包装类:“equals” 比较内容
System.out.println(A.equals(B));//true 内容相等
System.out.println(A.equals(C));//false 内容不相等
//String类型:“==” 比较引用
String S1 = new String("aaa");
String S2 = new String("aaa");
String S3 = new String("bbb");
System.out.println(S1 == S2);//false 地址不相等,没有指向同一个引用
System.out.println(S1 == S3);//false 地址不相等,没有指向同一个引用
//String类型:“equals” 比较内容
System.out.println(S1.equals(S2));//true 内容相等
System.out.println(S1.equals(S3));//false 内容不相等
//字符串常量: "==" 比较引用
String s1 = "aaa";
String s2 = "aaa";
String s3 = "ccc";
System.out.println(s1 == s2);//true 地址相等,指向同一个引用
System.out.println(s1 == s3);//false 地址不相等
//字符串常量: "equals" 比较内容
System.out.println(s1.equals(s2));//true 内容相等
System.out.println(s1.equals(s3));//false 内容不相等
System.out.println(S1 == s1);//false 地址不相等,对象实例在Java堆,字符串常量在方法区的常量池
System.out.println(s1.equals(S1));//true 内容相等
System.out.println(S1.equals(s1));//true 内容相等
//没有覆写equals方法的引用数据类型: "==" 比较引用
verify1 v1 = new verify1();
verify1 v2 = new verify1();
System.out.println(v1 == v2);//false 地址不相等
//没有覆写equals方法的引用数据类型: "equals" 比较引用
System.out.println(v1.equals(v2));//false 地址不相等
}
}
String重写了equals方法
public boolean equals(Object anObject) { // 方法签名与 Object类 中的一致
if (this == anObject) { // 先判断引用是否相同(对象地址是否相同)
return true;
}
if (anObject instanceof String) { // 再判断类型是否一致,
// 最后判断内容是否一致.
String anotherString = (String)anObject;
int n = count;
if (n == anotherString.count) {
char v1[] = value;
char v2[] = anotherString.value;
int i = offset;
int j = anotherString.offset;
while (n-- != 0) {
if (v1[i++] != v2[j++])
return false;
}
return true;
}
}
return false;
}
判断过程如下:
1.先进行引用判断
2.不是同一引用再进行类型判断
3.是同一类型再进行内容判断
其他基本数据的包装类的equals方法的实现同样可以参考上述判断过程
Object类中的equals方法
Object类中的equals方法用于检测两个对象是否指向同一个引用,如果指向同一个引用,则他们是相等的。
Java.util.Objects 7
• Static boolean equals(Object a, Object b)
如果a和b都为null,返回true;如果只有其中一个为null,返回false;都不为null,返回a.equals(b).
但是有时候我们还需要检测两个对象的状态的相等性,必须两个雇员的姓名,联系方式,电话等等都一样,才认为他们是相等的,这时候就需要覆写equals方法。
equals和hashCode()的关系
- 如果a.equals(b)返回true,则a和b的hashCode()一定相等;
- 如果a.equals(b)返回false, 则a和b的hashCode()可以相等,也可以不相等;
- 如果a和b 的hashCode()方法返回结果不相等,则a.equals(b)一定返回false.