2010-05-03 3 views

Répondre

4

En regardant le source de l'implémentation de Hashtable, on dirait qu'il utilise déjà un chaînage séparé. Si vous regardez la classe Entry<K,V> à partir de la ligne 901, vous verrez qu'il contient une référence à une autre entrée nommée next. Si vous regardez alors la méthode put(), sur la ligne 420 la référence next est remplie via le constructeur pour être n'importe quel élément précédemment stocké dans ce compartiment.

Notez que vous ne devriez généralement pas être concerné par les détails d'implémentation tels que ceux-ci. Le Java Collections Framework est probablement l'un des frameworks les plus utilisés en Java, et en tant que tel, vous devez supposer que les auteurs ont ajusté les performances pour qu'elles soient aussi bonnes que possible.

Une autre chose que je tiens à souligner est que la classe Hashtable a été remplacée par la classe HashMap (qui utilise également un chaînage séparé, voir here). La principale différence entre les deux est que toutes les méthodes de Hashtable sont synchronisées, alors que dans HashMap elles ne le sont pas. Cela conduit à de meilleures performances dans les situations où vous exécutez dans un environnement à un seul thread (peut-être la raison de cette question?).

Si vous faites ont besoin d'un plan thread-safe mise en œuvre, alors vous devriez envisager soit envelopper un HashMap normal dans un appel à Collections.synchronizedMap(), ou en utilisant un ConcurrentHashMap.