実装を行うことthis.next = new Node[R];
で、レベル 1 のノードに 26 個のポインタを持つ配列が割り当てられ、次にレベル 2 のノードに 26^26 個のポインタが割り当てられ、次にレベル 3 のノードに 26^26^26 個、というように割り当てられます。これが、メモリ不足の原因の 1 つになる可能性があります。
実装を変更して、すべての Node が小さい初期容量 (たとえば 5) のノードの HashMap を持つようにすることができます。HashMap は、実際に必要な場合にのみ拡張されます。これにより、メモリが節約されます。
そのコードの別の問題は、次のdelete
とおりです。
// delete a node
public void delete(Node node) {
for(int i = 0; i < R; i++) {
if(node.next != null) {
delete(node.next[i]);
}
}
node = null; // <-- this is not doing anything!
}
何もしない理由は、ノードへの参照がby value
Java で渡されるためです。したがって、実際の参照はそのまま残ります。代わりにすべきことは次のとおりです。
// delete a node
public void delete(Node node) {
for(int i = 0; i < R; i++) {
if(node.next != null) {
delete(node.next[i]);
node.next[i] = null; // <-- here you nullify the actual array item
} // which makes the object a good candidate for
// the next time GC will run
}
}
そのため、メモリ リークの可能性もあります -delete
空き領域を期待している場合。