当前位置:编程学习 > JAVA >>

Thinking in Java之hashCode()方法

       一直对hashCode()这个方法由困惑,也不知道什么时候该去实现hashCode()方法。趁着研究

          源码的这段时间吧hashCode()方法做一个总结。

       HashCode返回值
              Java中每个对象都是Object的子类,也就用于hashCode()方法,查看源码可以知道,hashCode()

          方法返回的是一个整数,这有什么实际含义吗?

              其实hashCode()方法返回的是对象的哈希码,那么对象的哈希码又是个什么东东?

          简单的来书对象的哈希码代表了对象的特征。对象的特征有阵各种的表现形式,例如对象的物理

          地址,字符串内容,或者数字算出来的int类型的数值。哈希码既然用于表示对象的特征,就可以

          用于判断对象是否相等,所以在实际情况下如果对象通过equals方法是相等的,那么其hashCode

          返回的值也是相等的。例如String类。  

[java]
package com.kiritor; 
 
public class HashTest { 
  public static void main(String[] args) { 
    String a = "AAA"; 
    String b ="AAA"; 
    System.out.println(a.hashCode()); 
    System.out.println(b.hashCode()); 

package com.kiritor;

public class HashTest {
  public static void main(String[] args) {
 String a = "AAA";
 String b ="AAA";
 System.out.println(a.hashCode());
 System.out.println(b.hashCode());
}
}
              两句Sysout语句输出的结果都是一样的!Object的hashCode()方法其实就是根据对象的物理地

          址生成的hash值,Object的equals方法判断的也是物理地址。这里由于Object的hashCode方法是

          native的我们就解析下String 类的hashCode的源码吧:


[java]
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; 
   } 

 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的hashCode就是根据字符串的内容来的,而其equals方法比较的也是字符串的


         内容。


[java]
public boolean equals(Object anObject) { 
     if (this == anObject) { 
         return true; 
     } 
     if (anObject instanceof String) { 
         String anotherString = (String) anObject; 
         int n = value.length; 
         if (n == anotherString.value.length) { 
             char v1[] = value; 
             char v2[] = anotherString.value; 
             int i = 0; 
             while (n-- != 0) { 
                 if (v1[i] != v2[i]) 
                         return false; 
                 i++; 
             } 
             return true; 
         } 
     } 
     return false; 
 } 

   public boolean equals(Object anObject) {
        if (this == anObject) {
            return true;
        }
        if (anObject instanceof String) {
            String anotherString = (String) anObject;
            int n = value.length;
            if (n == anotherString.value.length) {
                char v1[] = value;
                char v2[] = anotherString.value;
                int i = 0;
                while (n-- != 0) {
                    if (v1[i] != v2[i])
                            return false;
                    i++;
                }
                return true;
           

补充:软件开发 , Java ,
CopyRight © 2022 站长资源库 编程知识问答 zzzyk.com All Rights Reserved
部分文章来自网络,