2015-12-21 21 views
0

嗯,在我看來,對象的hashCode()可能與C++中的對象地址是一樣的,所以我期望在插入數據之前和之後對象的hashCode保持不變。爲什麼ArrayList在插入數據後更改其哈希碼?

import java.util.ArrayList; 
import java.util.HashMap; 
import java.util.List; 

/** 
* Created by charlie on 2015/12/11. 
*/ 
public class Hello { 
    public static void main(String[] args) { 
     List<Integer> a = new ArrayList<>(1024); 
     a.add(0, 1); 
     System.out.println(a.hashCode()); 
     a.add(1, 2); 
     System.out.println(a.hashCode()); 
    } 
} 

但似乎輸出不同的值,因此這意味着插入值後,新的列表對象是原來的深層副本價值?

+2

_in my opinion_你的意見是基於什麼? javadoc說什麼? –

+1

hashCode不是地址,而是計算出的對象內容的散列值 – sidgate

+0

通常,對對象進行變異將修改其哈希碼。它在技術上是可行的(儘管給出一個體面的散列函數是不可能的),您可能會以散列碼不會改變的方式進行轉換。 – Kevin

回答

2

hashCode不是對象的地址,而是計算出的對象內容的散列值。請參閱javadoc以獲取更多信息

如果要比較並檢查它是否是同一個對象,則可以使用==運算符來檢查引用。

+0

那麼我怎樣才能確保在插入之前或之後,列表對象仍然是同一個對象,而不是深層複製的對象? – python

+0

@python答案已更新 – sidgate

2

根據Javadocs,List的哈希碼將根據其中的單個對象哈希碼進行計算。所以,無論何時將元素添加到列表中,這都將直接影響List的hashCode。

請參閱以下文件。爲了計算哈希碼,它是通過每個元素迭代


INT的hashCode()
返回此列表的哈希碼值。列表的哈希碼被定義爲以下計算的結果:

int hashCode = 1; (E ==:列表)
(E e:list)
hashCode = 31 * hashCode +(e == null?0:e.hashCode());

這確保list1.equals(列表2)意味着實現list1.hashCode()== list2.hashCode()爲任何兩個列表,列表1和list2中,所要求的Object.hashCode的常規合同() 。

希望這有助於..

0

按照Java文檔,列表的hashCode由在列表中添加的因素的影響。因此,在向其中添加元素之前和之後的列表值hashCode是不同的。

下面是一個Java使用來計算列表的hashCode代碼:

int hashCode = 1; 
    for (E e : list) 
     hashCode = 31*hashCode + (e==null ? 0 : e.hashCode()); 

這裏E是元素的列表類型(List<E>

所以這是從上面清楚計算hashCode世代也取決於要添加到列表中的元素的hashCode

這就是在向列表中添加另一個元素後得到不同值hashCode的原因。