hashCode()常见面试题(持续更新)

hashcode等于对象存储的内存地址吗?

不一定相等。

首先:因为==是比较对象的内存地址的,如下题所示结果。

另外,有个大神直接用java&c++试了一下,点击查看

结论是:hashCode返回的并不一定是对象的(虚拟)内存地址,具体取决于运行时库和JVM的具体实现。

hashCode()的返回值和==的关系

若x == y返回“true”,那么x和y的hashCode()必须相等。
x == y返回“false”,那么x和y的hashCode()有可能相等,也有可能不等。

验证代码如下:

<span style="font-size:18px;">public class Test {
	public static void main(String[] args) {
		Integer i1=-128,i2=-128,i3=-129,i4=-129;
		System.out.println("i1==i2 "+(i1==i2));
<span style="white-space: pre;">		</span>System.out.println("i1的hashcode="+i1.hashCode()+",i2的hashcode="+i2.hashCode());
<span style="white-space: pre;">		</span>System.out.println("i3==i4 "+(i3==i4));
<span style="white-space: pre;">		</span>System.out.println("i3的hashcode="+i3.hashCode()+",i4的hashcode="+i4.hashCode());
		
		//输出结果为:
		/*
		i1==i2 true
		i1的hashcode=-128,i2的hashcode=-128
		i3==i4 false
		i3的hashcode=-129,i4的hashcode=-129
		*/
	}
	
}</span>

对象的hashcode是用来干什么的?

是jdk根据对象的地址或者字符串或者数字算出来的int类型的数值。一定程度上反映了对象的位置信息。

所以常与equals一起来判断对象是否相等。

这位博主写的很好:(原文链接:http://blog.csdn.net/chinayuan/article/details/3345559

<span style="font-size:18px;">以java.lang.Object来理解,JVM每new一个Object,它都会将这个Object丢到一个Hash哈希表中去,这样的话,下次做Object的比较或者取这个对象的时候,它会根据对象的hashcode再从Hash表中取这个对象。这样做的目的是提高取对象的效率。具体过程是这样:
1.new Object(),JVM根据这个对象的Hashcode值,放入到对应的Hash表对应的Key上,如果不同的对象确产生了相同的hash值,也就是发生了Hash key相同导致冲突的情况,那么就在这个Hash key的地方产生一个链表,将所有产生相同hashcode的对象放到这个单链表上去,串在一起。
2.比较两个对象的时候,首先根据他们的hashcode去hash表中找他的对象,当两个对象的hashcode相同,那么就是说他们这两个对象放在Hash表中的同一个key上,那么他们一定在这个key上的链表上。那么此时就只能根据Object的equal方法来比较这个对象是否equal。当两个对象的hashcode不同的话,肯定他们不能equal.</span>

hashcode的获取方式

1.对象.hashcode();

//如果重写了,按照重写的规则返回hashcode,对象为null,报空指针异常

2.System.identityHashCode(Object x);

//即使重写了hashcode方法,也会返回jdk给出的hashcode。如果对象为null,返回0

  • 2
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值