文章目录
前言
== 比较的是内存地址;
equals 先比较内存地址是否相同,再比较值(字符序列)是否相同。
提示:以下是本篇文章正文内容,下面案例可供参考
hashCode相同时equals和==结果是否一定为true?
示例1.1 以String为例:
String strA = "Aa";
String strB = "BB";
System.out.println("*************** HashCode ****************");
System.out.println("strA hashCode: " + strA.hashCode());
System.out.println("strB hashCode: " + strB.hashCode());
System.out.println("*************** 内存地址 ****************");
System.out.println("strA内存地址:" + System.identityHashCode(strA));
System.out.println("strB内存地址:" + System.identityHashCode(strB));
System.out.println("*************** 比较 ****************");
System.out.println("strA == strB: " + (strA == strB));
System.out.println("strA equals strB: " + strA.equals(strB));
执行结果:
*************** HashCode ****************
strA hashCode: 2112
strB hashCode: 2112
*************** 内存地址 ****************
strA内存地址:2133927002
strB内存地址:1836019240
*************** 比较 ****************
strA == strB: false
strA equals strB: false
示例1.1解析
(1)strA.equals(strB)
首先看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;
}
String equals方法:
第一步使用 == 来判断两个值的地址是否相同,
strA内存地址:2133927002
strB内存地址:1836019240
由此可见第一步成立。
第二步使用 instanceof 来比较strA 和 strB,由于strA 和 strB都是字符串,此处成立。
第三步比较strA 和 strB长度,两个字符串长度都是2,此处成立。
第四步比较两个先将两个字符串转成字符数组,再去比较每一位的值是否相同,此处不成立,返回 false。
结果:strA.equals(strB) 为 false。
(2)strA == strB
strA内存地址:2133927002
strB内存地址:1836019240
结果:strA 和 strB两个字符串值的地址不同,所以 strA == strB 为 false。
示例1.2 hashCode 和 字符串的值都相同时
String s1 = "ABCDEF";
String s3 = "DEF";
String s4 = "ABC" + s3;
System.out.println("*************** 值 ****************");
System.out.println(s1);
System.out.println(s4);
System.out.println("*************** HashCode ****************");
System.out.println(s1.hashCode());
System.out.println(s4.hashCode());
System.out.println("*************** 内存地址 ****************");
System.out.println(System.identityHashCode(s1));
System.out.println(System.identityHashCode(s4));
System.out.println("*************** 比较 ****************");
System.out.println(s1.equals(s4));
System.out.println(s1 == s4);
执行结果:
*************** 值 ****************
ABCDEF
ABCDEF
*************** HashCode ****************
1923910755
1923910755
*************** 内存地址 ****************
1956725890
356573597
*************** 比较 ****************
true
false
示例1.2解析
s1 和 s4 的值 和 hashCode都相同,地址不同,所以 equals 为true,== 为 false。
为什么值相同地址不同:String s4 = “ABC” + s3; 计算时 由于s3为变量,在运行时才能得出s4的值,所以无法使用常量池里"ABCDEF"的值,因此s4的地址和"ABCDEF"的地址不同。