2015-10-23 4 views
7

Hier Hashtable#get:Warum verwendet Hashtable den Eintrag <?,?> intern?

@SuppressWarnings("unchecked") 
public synchronized V get(Object key) { 
    Entry<?,?> tab[] = table; 
    int hash = key.hashCode(); 
    int index = (hash & 0x7FFFFFFF) % tab.length; 
    for (Entry<?,?> e = tab[index] ; e != null ; e = e.next) { 
     if ((e.hash == hash) && e.key.equals(key)) { 
      return (V)e.value; 
     } 
    } 
    return null; 
} 

Warum es Entry<?,?> verwenden nicht statt Entry<K,V>?

+0

Der Quellcode, den ich habe (1.8), sagt, dass die Instanzvariable 'table' auch wildcracked ist -' private transient Entry [] table; '. – rgettman

Antwort

1

Hashtable Die Erstellung ist älter als jede Arbeit, die mit Generika in Java 1.5 durchgeführt wurde. Das wahrscheinlichste Szenario war, dass die Generika nachgerüstet wurden.

Obwohl eine größere Tell aufgrund der Tatsache sein kann, dass table ein Array ist, und Generika und Arrays einfach nicht gut auskommen.

Wenn table (das Feld in Hashtable) wurden getippt, dann würden Sie mit einer Menge von diesen Erklärungen zu tun haben ...

// Generic array creation! 
Entry<K, V>[] newMap = new Entry<K, V>[newCapacity]; 

... und die wahrscheinliche Design/Umsetzung Entscheidung Streben nach Kompatibilität im Gegensatz zu einer vollständigen Übernahme von Generika.

Beachten Sie auch, dass mit einem Platzhalter ein Array-Typ zu schaffen wird keine Fehler bei der Kompilierung verursachen, während ein Array mit einer konkreten Art zu schaffen wird, aufgrund der Tatsache, dass ein generischer Typ mit einem ungebundenen Wildcard is considered reifiable:

List<?>[] foo = new ArrayList[10]; // perfectly legal but not encouraged 
List<String> bar = new ArrayList[10]; // not legal 

Die Konvention geht nach vorn wäre HashMap stattdessen zu verwenden, da diese bestimmte Implementierung sowohl synchronisiert ist und noch eine Menge Pre-1.5 Konventionen in ihm verwendet. (Wenn Sie eine Synchronisation wünschen, empfehlen auch die Dokumente ConcurrentHashMap.)

Verwandte Themen