hashcode源码
① HashMap源码中put方法里面e.hash == hash && ((k = e.key) == key || key.equals(k))
我认为这个是比较效率的问题,这样写可以尽量少的调用equals
如果把e.hash == hash去掉,只用equals比较,效率太低
(k = e.key) == key如果是true说明是同一个对象,就不用equals了,效率较高
② java 的Object类的hashcode方法具体是怎么实现的
hashcode其实是使用了散列函数的数据结构,具体的实现的话,需要参考源码了
③ Java语言中Object对象的hashCode取值的底层算法是怎样实现的
在JDK中看到
public native int hashCode();
这是一个本地方法,需要找源代码才能找到
然后我在Android SDK中的JDK Object类找到了这个,应该是你想要的了
publicinthashCode(){
intlockWord=shadow$_monitor_;
finalintlockWordStateMask=0xC0000000;//Top2bits.
finalintlockWordStateHash=0x80000000;//Top2bitsarevalue2(kStateHash).
finalintlockWordHashMask=0x0FFFFFFF;//Low28bits.
if((lockWord&lockWordStateMask)==lockWordStateHash){
returnlockWord&lockWordHashMask;
}
returnSystem.identityHashCode(this);
}
但最后的System.identityHashCode(this)方法还是一个本地方法,还得去找源码,你折腾的话自己去搜索吧。
下面是String类的hashCode()方法,可以看下
publicinthashCode(){
inth=hash;
if(h==0&&value.length>0){
charval[]=value;
for(inti=0;i<value.length;i++){
h=31*h+val[i];
}
hash=h;
}
returnh;
}
④ JAVA中,String类中的hashCode()方法有什么作用呢
hash从意义上来说应该是实现值的比较。
hashCode值与对象引用没有必然联系。在java中,值相同的两个字符串不一定是同个对象。比如你上面的a和b就是两个不同的对象。
字符串的hash值是根据字符串的值计算的,相同值的字符串对象hash值一定相同,具体的计算方法在jdk的文档中有描述.
每个java对象都有一个唯一的标识,object类中的hash方法就是直接返回对象的这个内部id号,与string的hash方法是不同的,object的hash方法能够用来区分不同的对象.因为原始的object对象没有任何有意义的值可用来计算哈希
⑤ java中hashcode到底有什么用,用于什么情况,怎么用
在Java集合中有两类,一类是List,一类是Set
他们之间的区别就在于List集合中的元素师有序的,且可以重复,而Set集合中元素是无序不可重复的。
对于List好处理,但是对于Set而言我们要如何来保证元素不重复呢?
通过迭代来equals()是否相等。数据量小还可以接受,当我们的数据量大的时候效率可想而知(当然我们可以利用算法进行优化)。
比如我们向HashSet插入1000数据,难道我们真的要迭代1000次,调用1000次equals()方法吗?hashCode提供了解决方案。
怎么实现?我们先看hashCode的源码(Object)。
publicnativeinthashCode();
它是一个本地方法,它的实现与本地机器有关,这里我们暂且认为他返回的是对象存储的物理位置(实际上不是,这里写是便于理解)。
当我们向一个集合中添加某个元素,集合会首先调用hashCode方法,这样就可以直接定位它所存储的位置,
若该处没有其他元素,则直接保存。
若该处已经有元素存在,就调用equals方法来匹配这两个元素是否相同,
相同则不存,不同则散列到其他位置。
这样处理,当我们存入大量元素时就可以大大减少调用equals()方法的次数,极大地提高了效率。
所以hashCode在上面扮演的角色为寻域(寻找某个对象在集合中区域位置)。
hashCode可以将集合分成若干个区域,每个对象都可以计算出他们的hash码,可以将hash码分组,每个分组对应着某个存储区域,根据一个对象的hash码就可以确定该对象所存储区域,这样就大大减少查询匹配元素的数量,提高了查询效率。
⑥ 谁知道,在java里,object提供的hashcode是如何计算的,我看源代码是native类型
Java对于eqauls方法和hashCode方法是这样规定的:
1、如果两个对象相同,那么它们的hashCode值一定要相同;
2、如果两个对象的hashCode相同,它们并不一定相同 上面说的对象相同指的是用eqauls方法比较。 你当然可以不按要求去做了,但你会发现,相同的对象可以出现在Set集合中。同时,增加新元素的效率会大大下降。
如果你改写了equal()方法,令两个实际不是一个对象的两个实例在逻辑上相等了,但是hashcode却是不等。
所以要记得改写hashcode。
不改写会带来什么后果呢?当然,比如你在用hashmap,hashtable之类的设计hashcode的类的时候,就会出麻烦了。
至于如何改写一个hashcode,这就有好有坏了,看各人的功底了。现在还有专门的人在研究优秀的hash算法。
也就是说 List 是一个有序的、可重复的对象容器接口,Set是一个无序的、不可重复的对象容器接口 。后面都讲了 Set 是如何实现不重复的 :为了避免多次重复的使用 equal 方法带来的系统负担 ,set 首先调用hashCode 方法来检测 是否被占用 如果被占用 然后调用 equal 方法判断被占用的是否相同
⑦ JAVA 为什么它们的hashcode 是一样的
这个就是String这个类覆盖hashcode的源码
他是一个个字符转成char进行相加
⑧ Object的hashcode()方法是怎么实现的啊,内部的算法是什么啊
默认的hashCode的值好像是对象存储的逻辑地址,但是不是直接使用这个地址还是经过一个算法就不得而知了,具体的算法也只有sun公司的人才知道,看源码是没用的,hashCode使用的是本地方法。
⑨ 重写equals时什么时候调用hashcode啊 源码中也没见显示调用啊!求大神指点
hashCode方法是为了保证相同的对象具有相同的hashCode编码这种java默认机制
具体怎么用那是下一层的事情,不是我们这些做java顶层应用开发人员的考虑的事情
⑩ java hashcode 有什么用
在Java集合中有两类,一类是List,一类是Set
他们之间的区别就在于List集合中的元素师有序的,且可以重复,而Set集合中元素是无序不可重复的。
对于List好处理,但是对于Set而言我们要如何来保证元素不重复呢?
通过迭代来equals()是否相等。数据量小还可以接受,当我们的数据量大的时候效率可想而知(当然我们可以利用算法进行优化)。
比如我们向HashSet插入1000数据,难道我们真的要迭代1000次,调用1000次equals()方法吗?hashCode提供了解决方案。
怎么实现?我们先看hashCode的源码(Object)。
publicnativeinthashCode();它是一个本地方法,它的实现与本地机器有关,这里我们暂且认为他返回的是对象存储的物理位置(实际上不是,这里写是便于理解)。
当我们向一个集合中添加某个元素,集合会首先调用hashCode方法,这样就可以直接定位它所存储的位置,
若该处没有其他元素,则直接保存。
若该处已经有元素存在,就调用equals方法来匹配这两个元素是否相同,
相同则不存,不同则散列到其他位置。
这样处理,当我们存入大量元素时就可以大大减少调用equals()方法的次数,极大地提高了效率。
所以hashCode在上面扮演的角色为寻域(寻找某个对象在集合中区域位置)。
hashCode可以将集合分成若干个区域,每个对象都可以计算出他们的hash码,可以将hash码分组,每个分组对应着某个存储区域,根据一个对象的hash码就可以确定该对象所存储区域,这样就大大减少查询匹配元素的数量,提高了查询效率。