2016-02-29 8 views
12

ArrayListの私の理解ごとに、デフォルトの容量は10であり、それは10を超えて大きくなると、それはなぜ新しい要素を追加するたびにArrayListのhashCode()が変わるのですか?

を新しい能力を持つ新しいオブジェクトを作成し、その..になりますので、好奇心から、私がチェックするには、次のプログラムを入力として第11回要素を加えながら、それは新しいオブジェクトを作成し、能力を高めますので

public class TestCoreJava { 

    public static void main(String [] args){ 

     ArrayList al = new ArrayList(); 

     for(int i=0;i<15;i++){ 

      al.add("Temp"+i); 
      System.out.println("Hashcode for "+i+" element "+al.hashCode()); 
     } 
    } 
} 

上記のシナリオによると、私はArrayListデフォルトの初期容量を設定しておりませんときは10 次のようになります。ArrayListオブジェクトのhashcode()ArrayList

ArrayListオブジェクトのハッシュコードを印刷すると、毎回新しいhashcode()が返されます。続き

は、O/Pである:新しいオブジェクトは、その時点までに作成する必要はありませんよう

Hashcode for 0 element 80692955 
Hashcode for 1 element -1712792766 
Hashcode for 2 element -1476275268 
Hashcode for 3 element 1560799875 
Hashcode for 4 element 1220848797 
Hashcode for 5 element -727700028 
Hashcode for 6 element -1003171458 
Hashcode for 7 element -952851195 
Hashcode for 8 element 607076959 
Hashcode for 9 element 1720209478 
Hashcode for 10 element -6600307 
Hashcode for 11 element -1998096089 
Hashcode for 12 element 690044110 
Hashcode for 13 element -1876955640 
Hashcode for 14 element 150430735 

は、デフォルトの容量の概念によると、10要素まで、それは同じhashcode()を印刷しているはずですが、それはありますそうではありません。

+0

hashCode()は、要素が同じで容量が同じ2つのリストが異なるハッシュコードを返すようにするequals()に結びついています。 – Thomas

+0

可能な複製[JavaでequalsとhashCodeをオーバーライドするときに考慮すべき点は何ですか?](http://stackoverflow.com/questions/27581/what-issues-should-be-considered-when-overrid-equals-and-hashcode-in- java) – Raedwald

答えて

32

hashCodeArrayListArrayListに格納されているすべての要素のhashCode Sの関数であるので、あなたが追加したり、要素を削除するか、要素の一つを変異させたときに容量が変化すると、それが変化したとき、それは変更されません。そのhashCodeを変更する方法で。

public int hashCode() { 
    int hashCode = 1; 
    for (E e : this) 
     hashCode = 31*hashCode + (e==null ? 0 : e.hashCode()); 
    return hashCode; 
} 

ところで、これはListインタフェースのhashCode()のJavadocの中に表示される正確なコードは次のとおりです。

は、ここで(それが実際にAbstractListに実装されています)は、Java 8の実装ですint java.util.List.hashCode()

ハッシュコードの値を返します。このリスト。リストのハッシュコードは、次の計算の結果であると定義される:

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

私に正しい答えを教えてくれてありがとうございました:) – suyash

4

hashCodeListの実装はdefined in terms of the hashCode of it's elementsあります。これは、ArrayListが適合するListの実装であることを意味します。hashCodeは、コンテンツが変更されたときに変更されます。

さらに一般的には、可変オブジェクトの場合、hashCodeは、変更するたびに、equalを以前の状態にする方法で変更する必要があります。

default hashCodeObjectであると仮定しているようですが、そうではありません。

ArrayListhashCodeを実装しなかった場合でも、内部配列が再割り当てされた場合ArrayListオブジェクト自体は同じままとして、また、ArrayListの(またidentity hash codeとしても知られる)デフォルトのハッシュコードは単に、変化しません内部配列オブジェクト(直接アクセスできないオブジェクト)は新しい配列オブジェクトに置き換えられます。 2つのオブジェクトが同じを生成しなければならない二つの物体の各々にhashCodeメソッドを呼び出して、等しい(オブジェクト)の方法に従って等しい場合

2

これに対する説明はthe docs for hashCode

を調べることによって見つけることができます整数結果。

ArrayListのコンテンツが変更されると、それは他のどのオブジェクトも同等に変更されます。内容がない、またはすべてのArrayListが同じhashCodeを持っていたときに、どちらかが持っている必要がArrayListObjectの契約のこの部分を満たすためには、hashCode変更があります。それを幾分有用にするために、彼らは明らかに前者を選択しました。これはList's docsを見て確認できます。

このリストのハッシュコード値を返します。リストのハッシュコードが は、次の計算の結果であると定義される:

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

これはlist1.equals(LIST2)を意味することを確実に list1.hashCode()== list2.hashCode()のためにObject.hashCode()の一般規約で要求されているように、リスト1とリスト2のいずれか2つのリスト

関連する問題