hashCode相同时equals和==结果是否一定为true?


前言

== 比较的是内存地址;
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"的地址不同。

结论: hashCode相同时equals和==结果不一定为true

  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值