两女一杯-亚搏体育客服

两女一杯-亚搏体育客服

面试时两女一杯-亚搏体育客服是否被问到过:两个对象值相同(x.equals(y) == true),但却可有不同的hashcode,这句话对不对?,如果我是面试官,我必问这个问题。

hashcode

这个问题要分情况回答:

第一种:如果没有重写equals和hashcode,那默认就是使用Object的,标签3Object中比较的是对象地址,如果2个对象相同,hashcode是肯定相同的。

第二种:自己重写equals和hashco两女一杯-亚搏体育客服de,这就不一定了。这得看你自己怎么写hashcode了。

既然提到自己重写equals和hashcode,那我就需要遵守java的规则:

  1. equals必须满足自反性、对称性、传递性、一致性,对于任意不为null的引用值x,x.equals(null)返回false;
  2. 如果两个对象相同(equals方法返回true),那么它们的hashCode值一定要相同,如果两个对象的hashCode相同,它们并不一定相同。

如果不满足这2点,相同的对象可以两女一杯-亚搏体育客服出现在Set集合中,同时增加新元素的效率会大大下降(对于使用哈希存储的系统,如果哈希码频繁的冲突将会造成存取性能急剧下降)

规则说完,就说下为什么hashcode会影响性能吧(重点,面两女一杯-亚搏体育客服试目的就是问他)

大家都知道hashCode()方法给对象返回一个hashcode值,而这个值是用来干什么的,有人知道吗,知道证明你还是两女一杯-亚搏体育客服了解些的。这个值用来决定它在hashtable、hashMap、hashSet中的存储位置。拿hashset来说,set中不允许存入相同的元素,如果不采用hashcode,比如已经存入了100个元素,存储101个元素就要比较100次equals方法,这样随着数据量的增多,比较的标签3就越来越多,性能会急剧下降。

所以标签5才引出了hashcode,将数据依特定算法直接指定到一个地址,这样一来,当集合要添加新的元素时,先调用这个元素的hashCode方法,就一下子能定位到它应该放置的物理位置上。如果这个位置上没有元素,它就可以直接存储在这个标签17位置上,不用再进行任何比较了;如果这个位置上已经有元素了,就调用它的equa标签20ls方法与新元素进行比较,相同的话就不存了,不相同就散列其它的地址。所以这里存在一个冲突解决的问题。这样一来实际调用equals方法的次数就大大降低了,几乎只需要一两次。

在重写equals和hashcode,hashcode重写的好与不好,完全决定了程序的性能。

总结:

  1. 理论上对象相同,hashcode一定相同,hashcode相同,对象不一定相同;
  2. 在重写equals和hashcode一定要注意equals的规则和hashcode的两女一杯-亚搏体育客服算法,否则会造成程序性能急剧下降。

小小的细节,决定了你能走多远的路两女一杯-亚搏体育客服。

Tags:

Add a Comment

电子邮件地址不会被公开。 必填项已用 *标注