これらは, 「ハッシュテーブル」として働くユーティリティ・クラス.
特に symbol table や string table としての使用を想定している, とのこと (See: SymbolTable, StringTable).
なお, 内部実装としては open hash で bucket 数は固定.
((cite: hotspot/src/share/vm/utilities/hashtable.hpp))
// This is a generic hashtable, designed to be used for the symbol
// and string tables.
//
// It is implemented as an open hash table with a fixed number of buckets.
//
// %note:
// - TableEntrys are allocated in blocks to reduce the space overhead.
このハッシュテーブルは, 内部的には以下の3つのクラスから構成されている.
より正確には, 以下のようなクラス階層を持つ.
BasicHashtableEntry -- ハッシュテーブル内の要素を表すクラスの基底クラス.
HashtableBucket -- ハッシュテーブル内の bucket を表すクラス
BasicHashtable -- Hashtable を表すクラスの基底クラス.
HashTable 内の要素を表すクラスの基底クラス.
((cite: hotspot/src/share/vm/utilities/hashtable.hpp))
class BasicHashtableEntry : public CHeapObj {
なお, このクラス自体は abstract class であり, 実際に使われるのはサブクラス.
内部には以下のフィールド(のみ)を含む.
((cite: hotspot/src/share/vm/utilities/hashtable.hpp))
unsigned int _hash; // 32-bit hash for item
// Link to next element in the linked list for this bucket. EXCEPT
// bit 0 set indicates that this entry is shared and must not be
// unlinked from the table. Bit 0 is set during the dumping of the
// archive. Since shared entries are immutable, _next fields in the
// shared entries will not change. New entries will always be
// unshared and since pointers are align, bit 0 will always remain 0
// with no extra effort.
BasicHashtableEntry* _next;
See: here for details
BasicHashtableEntry クラスの具象サブクラスの1つ.
((cite: hotspot/src/share/vm/utilities/hashtable.hpp))
template <class T> class HashtableEntry : public BasicHashtableEntry {
BasicHashtableEntry のフィールドに加えて, ハッシュ値の計算の基となった値自体を格納するための _literal フィールドが追加されている.
((cite: hotspot/src/share/vm/utilities/hashtable.hpp))
T _literal; // ref to item in table.
See: here for details
HashTable クラス内で使用される補助クラス.
ハッシュテーブル内の bucket を表すクラス. 中身は BasicHashtableEntry オブジェクトを格納するための線形リストになっており, HashTable クラスはこのクラスを用いてハッシュテーブルを構築する.
((cite: hotspot/src/share/vm/utilities/hashtable.hpp))
class HashtableBucket : public CHeapObj {
内部には以下のフィールド(のみ)を含む.
(BasicHashtableEntry は next フィールドを使って線形リストにできるので, 実際にはこのフィールドに BasicHashtableEntry のリストが格納されている. (See: BasicHashtable::addentry()))
((cite: hotspot/src/share/vm/utilities/hashtable.hpp))
BasicHashtableEntry* _entry;
See: here for details
ハッシュテーブルとして働くクラスの基底クラス.
(実質的には, Hashtable クラス用の補助クラスといった感じ)
((cite: hotspot/src/share/vm/utilities/hashtable.hpp))
class BasicHashtable : public CHeapObj {
なお, このクラス自体は abstract class であり, 実際に使われるのはサブクラス.
内部には HashtableBucket オブジェクトの配列を保持している.
((cite: hotspot/src/share/vm/utilities/hashtable.hpp))
HashtableBucket* _buckets;
See: here for details
BasicHashtable クラスの具象サブクラスの1つ.
((cite: hotspot/src/share/vm/utilities/hashtable.hpp))
template <class T> class Hashtable : public BasicHashtable {
See: here for details
特殊な HashTable クラス.
普通の HashTable クラスと異なり, ハッシュ値の計算に値を2個使用する (より具体的に言うと, compute_hash() メソッドが 1引数ではなく2引数になっている. これは, Symbol* 型の引数だけではなくクラスローダーを表す Handle 型の引数まで増えているため.)
((cite: hotspot/src/share/vm/utilities/hashtable.hpp))
// Verions of hashtable where two handles are used to compute the index.
template <class T> class TwoOopHashtable : public Hashtable<T> {
See: here for details
This document is available under the GNU GENERAL PUBLIC LICENSE Version 2.