java中hashcode()函数的作用
来源:互联网 发布:800002711零点网络 编辑:程序博客网 时间:2024/05/16 17:58
Java对象Hashcode的作用是什么?可以联想数据结构的哈希表(散列表)、哈希函数。Object.hashCode() 就是一个哈希函数,用来计算散列值以实现哈希表这种数据结构。
在一个数组中存储对象时,通过 hashCode 得到的哈希值来计算数组的索引位置(通常是求余运算),然后根据这个索引位置进行存取。多个对象计算出来的索引位置相同(叫hash冲突)时,用链表保存。冲突怎么保证取到的就是自己呢?那么就要用到 Object.equals() 方法。
所以要把对象存储在像 hash table类似的数据结构(比如:HashSet)中,hashCode 与 equals 要成对实现。
Java Object.hashCode()
返回该对象的哈希码值。支持该方法是为哈希表提供一些优点,例如,java.util.Hashtable 提供的哈希表。
hashCode 的常规协定是:
在 Java 应用程序执行期间,在同一对象上多次调用 hashCode 方法时,必须一致地返回相同的整数,前提是对象上 equals 比较中所用的信息没有被修改。从某一应用程序的一次执行到同一应用程序的另一次执行,该整数无需保持一致。
如果根据 equals(Object) 方法,两个对象是相等的,那么在两个对象中的每个对象上调用 hashCode 方法都必须生成相同的整数结果。
以下情况不是必需的:如果根据 equals(java.lang.Object) 方法,两个对象不相等,那么在两个对象中的任一对象上调用 hashCode方法必定会生成不同的整数结果。但是,程序员应该知道,为不相等的对象生成不同整数结果可以提高哈希表的性能。
上面的协定来看,一个对象的状态(这些状态不一定是所有字段,根据业务来看)没有改变时,多次调用 hashCode 必定相等。但是不同的对象可以有相等的 hashCode,不过尽量使不同的对象有不相等的 hashCode 可以提高哈希表的性能。
看下 Java Hashtable 的 get 与 put 实现:
public synchronized V get(Object key) {Entry tab[] = table;int hash = key.hashCode();int index = (hash & 0x7FFFFFFF) % tab.length;for (Entry< K,V> e = tab[index] ; e != null ; e = e.next) { if ((e.hash == hash) && e.key.equals(key)) {return e.value; }}return null;}先根据 key.hashCode 找数组的索引位置 index,hash & 0x7FFFFFFF 保证是正数。然后顺着找 hash 和 equals 相等的。冲突链越长性能就越差。
看 put 方法:
public synchronized V put(K key, V value) {// Make sure the value is not nullif (value == null) { throw new NullPointerException();}// Makes sure the key is not already in the hashtable.Entry tab[] = table;int hash = key.hashCode();int index = (hash & 0x7FFFFFFF) % tab.length;for (Entry< K,V> e = tab[index] ; e != null ; e = e.next) { if ((e.hash == hash) && e.key.equals(key)) {V old = e.value;e.value = value;return old; }}modCount++;if (count >= threshold) { // Rehash the table if the threshold is exceeded rehash(); tab = table; index = (hash & 0x7FFFFFFF) % tab.length;}// Creates the new entry.Entry< K,V> e = tab[index];tab[index] = new Entry< K,V>(hash, key, value, e);count++;return null;}先看是否有相同的,有就替换。然后数组空间不够,会重换分配空间并数据重新散列保存。最后在冲突链头上插入。
- java中hashCode函数的作用
- java中hashcode()函数的作用
- java中hashcode()函数的作用
- Java中hashCode的作用
- Java中hashCode的作用
- java中hashcode()的作用
- Java中hashCode()的作用
- java中HashCode的作用
- Java中hashCode的作用
- Java中hashCode的作用
- Java中hashCode的作用
- Java中hashCode的作用
- Java中hashCode的作用
- java中hashCode的作用
- Java中hashCode的作用
- Java中hashCode的作用
- Java中hashCode的作用
- Java中hashCode的作用
- 几种计算机求解Fibonacci number的方法
- HttpClient使用详解
- 新Hibernate SessionFactory().getCurrentSession()猫腻
- Redis的Java客户端Jedis的八种调用方式(事务、管道、分布式)介绍
- Java继承关系构造函数的调用
- java中hashcode()函数的作用
- 作业4.18
- 进程地址空间映射
- 开启gd2的方法
- Time Zone
- View的点击效果-水波纹
- 渗透测试元数据搜集之Metagoofil
- 导入hadoop源码到eclipse
- spring之jdbc配置到固定路径