面试必备-java的Object类

1. ==

  • 8种基本数据类型(char, int, double, boolean, float, byte, short, long),比较他们的值。
  • 引用类型的变量,比较的是他们在内存中的存放地址。对象是放在堆中的,栈中存放的是对象的引用,所以==是对栈中的值进行比较。

2. equals()

  • object类中的equals()方法比较的是对象的存放地址。
  • 如果要比较堆中对象的内容是否相同,就要重写equals()方法。

3. 重写equals()方法,为什么也需要重写hashcode()方法?

答:为了保证一致性,也就是说两个值相同的对象,根据equals()比较是相同的,根据hashcode()比较也应该是相同的。

因为默认的hashcode()是根据内存地址来比较的,如果你重写了equals()方法,让它根据对象的值进行比较,但是没有重写hashcode()方法,这个时候,他们两个的比较结果是矛盾的。

4. 为什么要保证这一点呢?

如果我们对一个对象重写了euqals,意思是只要对象的成员变量值相等那么euqals就等于true,但不重写hashcode,那么我们再new一个新的对象,当原对象.equals(新对象)等于true时,两者的hashcode却是不一样的,由此将产生了理解的不一致,存储散列集合时(如Set类),将会存储了两个值一样的对象,导致混淆,因此,就也需要重写hashcode()。

set集合不能有重复的元素,那么怎么能保证不放入重复的元素呢?
单靠equals方法比较的话,如果原来集合中有10000个元素了,那么放入第10001个元素,要将前面的所有元素都进行比较,看看是否有重复,这个效率可想而知,因此需要先用hashcode()方法进行比较,利用哈希算法,将对象数据根据该对象的特征使用特定的算法将其定义到一个地址上,那么在后面进来的数据只要看对应的hashcode地址上是否有值,如果有那么就用equals比较,如果没有则直接插入,这样就大大减少了equals的使用次数,执行效率就大大提高了。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

NEU_SML

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值