Java中的Hash值的计算方式,java哈希算法简单数据类型的具体实现

Java中的Hash值的计算⽅式,java哈希算法简单数据类型的具体实现最近被提及Java中HashMap的⼀些实现及哈希冲突等,借鉴了⼀位⽼哥的部分解析,⽐较明⽩的展⽰hash算法的应⽤吧
结论:
对于String、Integer等类复写了Object中的hashCode⽅法的类来说,有各⾃的实现⽅法
Object类中的hashCode()该⽅法是⼀个本地⽅法,Java将调⽤本地⽅法库对此⽅法的实现
先上代码,
public class Test {宋福如
public static void main(String[] args){
String str ="hello";
摇摇变String str2 ="world";
String str3 ="a";
String str4 ="1";
Integer i =1;
System.out.println("hello的 hashcode = "+str.hashCode());
System.out.println("world的 hashcode = "+str2.hashCode());
System.out.println("a的 hashcode = "+str3.hashCode());
System.out.println("字符串1的 hashcode = "+str4.hashCode());
System.out.println("整数对象1的 hashcode = "+i.hashCode());
String str5 ="abc";
System.out.println("abc的 hashcode = "+str5.hashCode());
String str6 ="abc ";
System.out.println("abc 的 hashcode = "+str6.hashCode());
}
}
代码的输出结果如下:
hello的 hashcode = 99162322
world的 hashcode = 113318802
a的 hashcode = 97
快乐点击字符串1的 hashcode = 49
整数对象1的 hashcode = 1
abc的 hashcode = 96354
abc 的 hashcode = 2987006
可以直观的看到,a字符的哈希值是97,是它的ASCII码值。然后整数对象的哈希值是它本⾝。经过查看源码,发现,hash值的计算,不同类型计算⽅式不同。具体实现如下:
Integer类的 hashcode() ⽅法在Integer类中被复写了,源码如下:
@Override
public int hashCode(){
return Integer.hashCode(value);
}
public static int hashCode(int value){
return value;
}
Integer类的hashcode返回的就是Integer本⾝的值。
对于String来说,具体的源码如下:
public int hashCode(){
int h = hash;
美国柯达公司
if(h ==0&& value.length >0){
char val[]= value;
for(int i =0; i < value.length; i++){
h =31* h + val[i];
}
hash = h;
}
return h;
}
生产力研究String对象会对对象的内容进⾏计算,得出hash值。
对于字符来说,像字符a会被转换为对应的ACII码值,也就是97,由于char的位数少于int型的位数,所以31*h+val[i] 计算时会被强制转换为int值。
验证计算,
abc的hashcode值为96354,那么即为 31*(31*(31*0+97)+98)+99=96354
空格的ASCII码值为32,所以 "abc " hashcode 为 96354*31+32 = 2987006
对于上⽂举例的String和Integer来说是复写了hashCode⽅法,以上述⽅式计算了hash值。
另外:
散列函数的计算⽅法主要有:
1、除余法
2、乘余取整法
3、平⽅取中法
4、数字分析法
5、基数转换法
6、折叠法
冲突解决策略:
1、分离链表法(拉链法)
水务局电大
在每⼀个相同的散列地址上构建链表。
2、闭散列⽅法(开放地址法)

本文发布于:2024-09-21 15:24:20,感谢您对本站的认可!

本文链接:https://www.17tex.com/xueshu/398284.html

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。

标签:计算   冲突   对象   链表   实现   源码
留言与评论(共有 0 条评论)
   
验证码:
Copyright ©2019-2024 Comsenz Inc.Powered by © 易纺专利技术学习网 豫ICP备2022007602号 豫公网安备41160202000603 站长QQ:729038198 关于我们 投诉建议