2016-06-25 15 views
-1

der Quellcode ist wie folgt:Eine Sache in der Methode "Transfer" in HashMap (jdk 1.6)?

void transfer(Entry[] newTable) { 
    Entry[] src = table; 
    int newCapacity = newTable.length; 
    for (int j = 0; j < src.length; j++) { 
     Entry<K,V> e = src[j]; 
     if (e != null) { 
      src[j] = null; 
      do { 
       Entry<K,V> next = e.next; 
       int i = indexFor(e.hash, newCapacity); 
       e.next = newTable[i]; 
       newTable[i] = e; 
       e = next; 
      } while (e != null); 
     } 
    } 
} 

aber ich möchte, wie dies zu tun, funktioniert das gut oder irgendein Problem? Ich denke, der Hash-Wert aller Elemente in der gleichen Liste ist gleich, so dass wir den buketIndex der neuen Tabelle nicht berechnen müssen, das einzige, was wir tun sollten, ist das Kopfelement in die neue Tabelle zu übertragen, und dies wird Zeit sparen. Vielen Dank für Ihre Antwort.

void transfer(Entry[] newTable){ 
    Entry[] src = table; 
    int newCapacity = newTable.length; 
    for(int j = 0 ;j< src.length;j++){ 
     Entry<K,V> e = src[j]; 
     if(null != e){ 
      src[j] = null; 
      int i = indexFor(e.hash,newCapacity); 
      newTable[i] = e; 
     } 
    } 
} 

Antwort

2

Ich glaube, Sie über die HashMap Klasse in Java implementierten fragen 6 und (insbesondere), ob Ihre Idee für die interne transfer() Methode Optimierung funktionieren würde.

Die Antwort ist Nein wird es nicht.

Diese transfer-Methode wird aufgerufen, wenn die Größe des Hauptarrays geändert wurde. Der Zweck besteht darin, alle vorhandenen Hash-Einträge in die richtige Hash-Kette in der Größestabelle zu übertragen. Dein Code bewegt einfach ganze Ketten. Das wird nicht funktionieren. Das Problem besteht darin, dass die Hash-Ketten typischerweise Einträge mit mehreren unterschiedlichen Hashcodes enthalten. Während eine bestimmte Gruppe von Einträgen in der alten Version der Tabelle alle zu derselben Kette gehörte, werden sie dies in der neuen Version wahrscheinlich nicht tun.

Kurz gesagt, Ihre vorgeschlagene Änderung würde einige Einträge "verlieren", weil sie an der falschen Stelle in der geänderten Tabelle sein würden.


Es gibt eine Meta-Antwort zu diesem auch. Die Standard-Java-Klassen wurden von einer Gruppe wirklich schlauer Softwareentwickler geschrieben und getestet. Seitdem wurde der Code wahrscheinlich von Zehntausenden von anderen Smart People außerhalb von Sun/Oracle gelesen. Die Wahrscheinlichkeit, dass alle anderen eine einfache/offensichtliche Optimierung wie diese verpasst hat ... ist verschwindend klein.

Also wenn Sie tun finden Sie etwas, das Ihnen wie eine Optimierung (oder ein Fehler) im Java-Quellcode für Java SE aussieht, sind Sie wahrscheinlich falsch!

+0

Oh, vielen Dank, ich habe es; Da diese Standardklassen so gut sind, möchte ich studieren und möchte mich selbst von diesen großartigen Menschen verbessern. – CAFEBABY

+0

wie Sie sagen: "Das Problem ist, dass die Hash-Ketten in der Regel Einträge mit mehreren verschiedenen Hashcodes enthalten.", Ich kann Ihnen nicht zustimmen, meiner Meinung nach sollte jedes Element (Entry) in der gleichen Hash-Kette den gleichen Hash haben Wert, wenn nicht, warum sind sie in der gleichen Kette? Und ich finde das Problem ist, dass die verschiedenen Hash-Ketten wahrscheinlich den gleichen buketIndex haben, wenn ich rehash, anders denke ich nichts; Natürlich hat meine Optimierung Probleme. – CAFEBABY

+1

Sie alle haben den gleichen Bucket-Index in der OLD-Tabelle, aber in der NEW-Tabelle wird die Größe und somit der Bucket-Index ('hashCode()% size') wahrscheinlich für jeden Eintrag unterschiedlich sein. Sie machen gefährliche Sprünge von "Ich verstehe nicht, wie das funktioniert" bis "dieser Code (oder Erklärung) muss falsch sein, weil es keinen Sinn für mich *** ***". Hören Sie so schnell wie möglich auf und Sie werden viel leichter neue Dinge lernen. Du hast noch eine Menge neuer Dinge zu lernen. –