[java]深入到Hashcode内部

 
    在java编程中hashcode(哈希编码)是一个很常见的词。自从java设计者使用了基于哈希算法的散列结构,它就通过哈希编码提供了内部支持。所有的类都从Object类继承了hashcode方法。这个方法返回了一个在32位机器中对于所有对象都唯一的32位整数型数字。

    Hashcode 和 == 对于32位机器,当你使用hashcode方法比较2个相同的对象将会得到“真”这个返回值。对于不同的对象这个方法将会返回“假”。

    对于64位机器,“==”的使用和hashcode操作开始变得不同,因为hashcode方法返回的是一个32为的整数型数值,而这些数值在64位的体系结构中无法展示在所有内存地址中。这样的情况下,不同的对象就会有相同的哈希编码。然而在64位的机器中,对相同对象的hashcode使用“==”会返回“真”。
 
下面的代码和输出表明一个对象的hashcode一般是相同的
 
代码
 
 
  
  1. package com.example; 
  2.   
  3. public class Test{ 
  4.   
  5.     public static void main(String[] args) { 
  6.         Test t = new Test(); 
  7.         System.out.println(t.hashCode()); 
  8.         System.out.println(t.hashCode()); 
  9.         Test t1 = new Test(); 
  10.         System.out.println(t1.hashCode()); 
  11.         System.out.println(t1.hashCode()); 
  12.     } 
输出
 
 
  
  1. 259937031 
  2. 259937031 
  3. 779942019 
  4. 779942019 
 
Hasccode 运算法则
 
    Object类的源码显示了hashcode方法是个本地方法,这就意味这这个方法的代码是使用像c语言之类的低级语言写的。java文档对于Object类的这个方法的实现引用如下:
 
 
  
  1. As much as is reasonably practical, the hashCode method defined by 
  2. class {@code Object} does return distinct integers for distinct 
  3. objects. (This is typically implemented by converting the internal 
  4. address of the object into an integer, but this implementation 
  5. technique is not required by the 
  6. JavaTM programming language.) 

重写Hashcode
 
    很少有规则需要java程序员要去遵循(至少理论上是这样)。“等于”和“哈希编码"的重写应当是要遵循的。但是不同的是应当有一个高效的hashcode方法被用于类对象去散列基本的数据结构。事实上,String类重写hashcode方法获得了最好的实践和使用。但是诸如Apache Commons HashBuilder的第三方jar包很容易的处理了hashcode的重写任务和提供了一个很好的实现。
 
There are few rules which any Java programmer is taught to follow (at least in theory). The equals and hashcode should always be followed. 
 
 
引用:http://www.javaexperience.com/java-dive-deep-into-hashcode-internals/
g:有些句子真难说通,还要看看长难句理解,有的的长难句还可能没法正确理解其意思,那就更糟了。坚持。。。