2013-06-28 33 views
2

下面是hashCode()String來源:在String的hashCode()中,offset的存在是什麼原因?似乎是多餘的

public int hashCode() 
{ 
    int h = hash; 

    if (h == 0 && count > 0) 
    { 
     int off = offset; 
     char val[] = value; 
     int len = count; 

     for (int i = 0; i < len; i++) 
     { 
      h = 31*h + val[off++]; 
     } 

     hash = h; 
    } 

    return h; 
} 

off被初始化爲offset,這是0(我到處在源和每個分配使它0,這一切)。然後在for循環中,通過off代替i迭代val。爲什麼是這樣?爲什麼不只是使用i並且不需要offset開始?我認爲offset存在很好的理由。任何見解?

+2

如果它是已經在內存中的另一個巨大字符串的子字符串,該怎麼辦? –

+0

「我想現在有一個很好的抵消偏差的理由,任何見解?」閱讀'substring'方法的代碼! –

+0

*下面是'String'的'hashCode()'的來源,屬於OpenJDK,可能是HotSpot。請注意,不同的JVM實現可以具有不同的'String'類的'hashCode'方法的實現,例如JRockit的。 –

回答

7

的字符串函數創建一個具有抵消其他大於0

public String substring(int beginIndex, int endIndex) { 
if (beginIndex < 0) { 
    throw new StringIndexOutOfBoundsException(beginIndex); 
} 
if (endIndex > count) { 
    throw new StringIndexOutOfBoundsException(endIndex); 
} 
if (beginIndex > endIndex) { 
    throw new StringIndexOutOfBoundsException(endIndex - beginIndex); 
} 
return ((beginIndex == 0) && (endIndex == count)) ? this : 
    new String(offset + beginIndex, endIndex - beginIndex, value); 
} 

此構造被稱爲值一個新的字符串。

// Package private constructor which shares value array for speed. 
String(int offset, int count, char value[]) { 
this.value = value; 
this.offset = offset; 
this.count = count; 
} 

因此抵消並不總是0

+0

完全錯過了。謝謝。 –

5

在Java中,可以將字符串定義爲父字符串的子字符串,以節省空間,如果您爲大字符串創建多個子字符串(例如解析它)。在這種情況下,他們使用偏移量來確定他們開始的父字符串的位置。

2

偏移和計數是在舊版本的子字符串的字符數組的共享使用。在當前版本中,不再使用共享,並且刪除了這些字段。請參閱1.7.0_15中的hashCode impl

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; 
} 
相關問題