簡単なケースを想像してください:
class B{
public final String text;
public B(String text){
this.text = text;
}
}
class A {
private List<B> bs = new ArrayList<B>;
public B getB(String text){
for(B b :bs){
if(b.text.equals(text)){
return b;
}
}
return null;
}
[getter/setter]
}
A の各インスタンスについて、List<B>
が大きく、getB(String)
頻繁に を呼び出す必要があると想像してください。ただし、リストが変更される可能性もあると仮定します (要素の追加/削除、または再割り当ても)。
この段階で、getB(String) の平均的な複雑さは O(n) です。これを改善するために、巧妙なキャッシングを使用できないかと考えていました。
キーがList<B>
である場所に をキャッシュすると想像してください。これによりパフォーマンスが向上しますが、リストが変更された場合 (新しい要素または削除された要素) または再割り当てされた場合 (新しい参照を指す) は機能しません。Map<String, B>
B.text
A.bs
それを回避するために、 とともにMap<String, B>
、 list のハッシュを格納できると考えましたbs
。メソッドを呼び出すgetB(String)
と、 list のハッシュが計算されますbs
。ハッシュが変更されていない場合はマップから結果を取得し、変更されている場合はマップをリロードします。
問題は、 a のハッシュをjava.util.List
計算すると、リストのすべての要素を調べて、少なくとも O(n) であるハッシュを計算することです。
質問
私が知りたいのは、JVM が List のハッシュを計算する際に、getB(String)
メソッドでループを実行するよりも高速になるかどうかです。のハッシュの実装に依存する可能性がありますB
。もしそうなら、どのようなことがうまくいくでしょうか?一言で言えば、これがばかげているのか、それともパフォーマンスの向上につながるのかを知りたいです。