当前位置:首页 » 操作系统 » hashcode源码

hashcode源码

发布时间: 2022-07-21 10:51:41

① 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方法,这样就可以直接定位它所存储的位置,

  1. 若该处没有其他元素,则直接保存。

  2. 若该处已经有元素存在,就调用equals方法来匹配这两个元素是否相同,

  3. 相同则不存,不同则散列到其他位置。


这样处理,当我们存入大量元素时就可以大大减少调用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码就可以确定该对象所存储区域,这样就大大减少查询匹配元素的数量,提高了查询效率。

热点内容
go语言编译模式 发布:2025-01-20 19:57:25 浏览:405
超能编程 发布:2025-01-20 19:56:26 浏览:1000
安卓手机怎么连蓝牙汽车 发布:2025-01-20 19:39:05 浏览:253
保定军工存储厂家 发布:2025-01-20 19:38:53 浏览:795
云服务器ecs服务条款 发布:2025-01-20 19:19:36 浏览:47
安卓系统显示屏怎么设置屏保 发布:2025-01-20 19:18:53 浏览:896
有锁机和配置锁哪个好 发布:2025-01-20 19:18:05 浏览:767
安卓版软件如何设置 发布:2025-01-20 18:58:53 浏览:58
java中级项目案例 发布:2025-01-20 18:58:52 浏览:913
sql日志查看工具 发布:2025-01-20 18:57:12 浏览:243