Java hashCode与identityHashCode区别

Java hashCode与identityHashCode区别

Object obj = new Object();
System.out.println(obj.hashCode()); //110718392
System.out.println(System.identityHashCode(obj)); //110718392

String str1 = "abc";
String str2 = new String("abc");
String str3 = "abc".intern();

System.out.println("hashCode:" + str1.hashCode() + " identityHashCode:" + System.identityHashCode(str1));
System.out.println("hashCode:" + str2.hashCode() + " identityHashCode:" + System.identityHashCode(str2));
System.out.println("hashCode:" + str3.hashCode() + " identityHashCode:" + System.identityHashCode(str3));
//hashCode:96354 identityHashCode:460141958
//hashCode:96354 identityHashCode:1163157884
//hashCode:96354 identityHashCode:460141958

System.out.println(str1 == str2); //false
System.out.println(str1 == str3); //true

总结:

  • 在不重写hashCode的情况下,二者的值都是一样的。
  • 这三个字符串的hashCode都是相同的,这是因为String类重写hashCode方法,通过String的值生成hashCode值,所以只要值相同,hashCode就相同。
  • str1与str2的identityHashCode不一样,是因为identityHashCode永远返回对象的内存地址,所以不相同;而str1与str3的identityHashCode相同,是因为intern方法会先从字符串常量池里获取字符串,所以二者的地址值相同。
  • ==比较的是两个对象的引用地址,所以str1 == str2返回false,(str1 == str3返回true。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值