java面试之 hashcode引发的头痛风波

1.hashCode()方法是Object类的一个方法,方法实现就是根据传入的对象地址值,然后根据一个公式快速计算出一个int值。其实就是地址的一个散列值,也叫对象的哈希代码值。

2.作用: 既然是Object的方法,那说明所有对象都有hashcode。它的作用是为更好的支持基于哈希机制的java集合类,例如Hashtable,HashMap,HashSet。如何支持法涉及到哈希表的数据结构,后面细说。先说说其他相关的。

3.java中==和eqauls()的区别?
  ==是运算符,用于比较两个变量是否相等,而equals是Object类的方法,用于比较两个对象是否相等.默认Object类的equals方法是比较两个对象的地址,此时和==的结果一样.换句话说:基本类型比较用==,比较的是他们的值.默认下,对象用==比较时,比较的是内存地址,如果需要比较对象内容,需要重写equals方法。

4.equals()和hashcode()的联系
两个都是Object的方法,如果两个对象根据equal()方法比较相等,那么调用这两个对象中任意一个对象的hashCode()方法必须产生相同的哈希值. 
如果两个对象根据equals()方法比较不相等,那么产生的哈希值不一定相等(碰撞的情况下还是会相等的)。
另外hashcode()肯定要比equals()快的多,要不hashcode对哈希表的支持就没有意义了。
根据规则: equals()相等的两个对象的hashCode()必须一样。如果重写了equals()方法,最好也重写hashCode()以保证符合这个规则,否则这个对象如果是作为hashmap的key值那就有问题了。
比如jdk的String类,重写了equals()方法同时也重写了hashCode()方法。

5.有没有可能两个不相等的对象有相同的hashcode?
有可能,两个不相等的对象可能会有相同的 hashcode 值,这就是为什么在 hashmap 中会有冲突。如果两个对象相等,必须有相同的hashcode 值,反之不成立.

可以在hashcode中使用随机数字吗?
不行,因为同一对象的 hashcode 值必须是相同的。

6.a==b与a.equals(b)有什么区别
如果a 和b 都是对象(非基本类型),且equals方法没有重写过,则 a==b 与a.equals(b) 其实是一样的,比较的都是两个对象的引用,只有当 a 和 b 指向的是堆中的同一个对象才会返回 true。

7.不是要说hashcode的作用吗?
所以hashcode()作用就是提高效率。
→→当向集合中插入对象时,如何判别在集合中是否已经存在该对象了?(注意:集合中不允许重复的元素存在[这里说的是set])
也许大多数人都会想到调用equals方法来逐个进行比较,这个方法确实可行。但是如果集合中已经存在一万条数据或者更多的数据,如果采用equals方法去逐一比较,效率必然是一个问题。此时hashCode方法的作用就体现出来了,当集合要添加新的对象时,先调用这个对象的hashCode方法,得到对应的hashcode值,实际上在HashMap的具体实现中会用一个table保存已经存进去的对象的hashcode值,如果table中没有该hashcode值,它就可以直接存进去,不用再进行任何比较了;如果存在该hashcode值, 就调用它的equals方法与新元素进行比较,相同的话就不存了,不相同就散列其它的地址,所以这里存在一个冲突解决的问题,这样一来实际调用equals方法的次数就大大降低了。

8.HashMap和Hashtable的区别和联系
相同点:
 实现原理相同,功能相同,底层都是哈希表结构,查询速度快,在很多情况下可以互用。
 不同点:
 1、Hashtable是早期提供的接口,HashMap是新版JDK提供的接口。
 2、Hashtable继承Dictionary类,HashMap实现Map接口。
 3、Hashtable线程安全,HashMap线程非安全。
 4、Hashtable不允许null值,HashMap允许null值。

9.hashmap数据结构
hash表,介于数组与链表之间。数组内存连续,空间复杂度大,插入删除耗时,但查找快;链表是分散的内存,插入删除快,查找慢。hash表结合了两者。
下期再说下hash表这个数据结构吧,尤其是它的扩容机制经常作为一个面试考点。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值