Java中的hashCode()是如何实现的?
来源:互联网 发布:jr史密斯cba数据 编辑:程序博客网 时间:2024/05/17 03:02
Java library里本身就对基本的数据类型进implement了不同的hashCode()。要注意的一点是,java 中的 hashCode() 是 int 类型,在64-bit的系统里,int 就只有32位,所以一些用64-bit的大数据类型(如Long)就要经过一些压缩处理,才能转成 int 类型hashCode。这点很重要,也是为什么Integer 和 Long 类的hashCode() implementation不同的原因。
我阅读了library的源代码后,按照不同的数据类型,总结一下,
1. 对简单的primitive data types, 像double, int, char等类型, 由于它们不是Object, 所以它们没有hashCode()的方法,这样写code是会有compile error的:
int a = 2;System.out.print( "int a = 2.hashCode()= " );System.out.println(a.hashCode());
2. 对于各自primitive data types的wrapper class,例如Integer, Double, Character等等,它们各自的hashCode() implementation也不一样,我写了如下的总结:
return (int)(bits ^ (bits >>> 32));第一段code与 floatToIntBits(value) 一样
第二段code是与Long.hashCode()一样Strings[0]*31^(n-1) + s[1]*31^(n-2) + ... + s[n-1]s[i] is the ith character of the string; why use 31? http://stackoverflow.com/questions/299304/why-does-javas-hashcode-in-string-use-31-as-a-multiplier
这个公式保证String里的第一个character都对最后产生的 hashcode 有所影响
3. 自定义的class, 如果override了equals()方法,那么就一定要override hashCode()方法,具体方法请看
http://stackoverflow.com/questions/113511/hash-code-implementation
Some FAQs:
Q1. 为何hashCode会是int而不是long呢?
答:因为在java中,一个Array的最大长度是:Integer.MAX_VALUE (http://stackoverflow.com/questions/4166195/why-objecthashcode-returns-int-instead-of-long)
Q2. fundamental question(白痴问题): 为什么Object class会有这个hashCode() ?Object 的 hashCode() 常用在什么地方?
答: hashCode()的本意是一个用来唯一标识object的一个code,可以把它当作加密后的密文。常用在Java自带的HashMap或HashTable的data structure 中。
Q3. Object.hashCode() 是如何实现的?
Here is the link that explains how the Object.hashCode() is implemented: http://stackoverflow.com/questions/2427631/how-is-hashcode-calculated-in-java
And also this: http://mindprod.com/jgloss/hashcode.html#OBJECT
- Java中的hashCode()是如何实现的?
- Java中的hashCode()是如何实现的?
- 如何正确的实现Java中的hashCode方法
- Java 中的 HashCode的作用?
- Java语言中Object对象的hashCode()取值的底层算法是怎样实现的?,object hashcode
- Java String的hashCode实现
- java中hashcode是怎么算出来的?
- Java语言中Object对象的hashCode()取值的底层算法是怎样实现的?
- Java语言中Object对象的hashCode()取值的底层算法是怎样实现的?
- java语言中Object对象的hashCode()取值的底层算法是怎样实现的
- c++中的"<<"是如何实现的?
- Java中的注解是如何工作的?
- Java中的注解是如何工作的?
- 如何不同的是javascript中的Java
- 如何不同的是javascript中的Java
- Java中的注解是如何工作的?
- Java中的注解是如何工作的?
- Java中的注解是如何工作的?
- MySQL配置文件my.cnf优化
- getSystemService()介绍
- 用数组初始化vector
- cglib
- Gallery与衍生BaseAdapter容器创建图片预览详解
- Java中的hashCode()是如何实现的?
- Select For update语句浅析
- struts常用配置
- JAVA--第12周实验--任务1--编写一个Panel的子类MyPanel,要求MyPanel的实例作为其按钮的ActionEvent事件的监视器
- Java判断时间,Email,手机号,身份证等是否为正确格式
- ERROR: cannot find MySQL include files 安装 coreseek-3.2.14 遇到的问题及解决
- squid代理服务器安装配置
- ARM中断学习一/[友善2440test中的中断处理部分]
- Android上oprofile使用说明