int[]
(ASCIIの場合)またはint[][]
Unicodeを使用して実装します。ボックス化された整数をハッシュマップに格納するメモリフットプリントを考えると、数字を使用することによってすべてのハッシュの競合が発生し、文字はキーとしての数字に他なりません。
public class CharacterBag {
private int[][] data = new int[255][];
public void add(char ch) {
int[] bin = data[ch >> 8];
if (bin == null) bin = data[ch >> 8] = new int[255];
bin[ch & 0xFF]++;
}
public int frequency(char ch) {
int[] bin = data[ch >> 8];
if (bin == null) return 0;
return bin[ch & 0xFF];
}
}
これは、ゼロのメモリフットプリントから始まり、Unicodeページごとに2Kを追加します。通常、テキストは1つまたは2つのUnicodeページの文字を使用します。
比較すると、HashMapを使用すると、ボックス化されたプリミティブをリンクリストのリストに格納するオーバーヘッド全体が発生します。文字ごとEntry
に、ボックス化されたキーを指す2つのポインターを持つクラスのオブジェクトと、すべてのフィールドを持つリンクリストオブジェクトがあります。このオブジェクトはNode
、前方ポインターと後方ポインターを持つクラスのオブジェクトを保持し、ボックス化された整数へのポインターを持ちます。 …続けましょうか?;)