私は、Java ArrayListソースコードを検索して、リストを配列に変換するとどうなるかを確認していました。私がallotを使用して知っているメソッドcontainsに出くわしました。このメソッドに対する最初の反応は、containsメソッドがどのようなアルゴリズムを使用するかということでした。
public boolean contains(Object o) {
return indexOf(o) >= 0;
}
public int indexOf(Object o) {
if (o == null) {
for (int i = 0; i < size; i++)
if (elementData[i]==null)
return i;
} else {
for (int i = 0; i < size; i++)
if (o.equals(elementData[i]))
return i;
}
return -1;
}
ソースコードから抽出された上記のコードは、ArrayListsが順次検索を使用していることを示しています。私自身、containsメソッドを使用して多くの人が参加しているのを目にします。これは、人々がアルゴリズムとJavaコレクションを知る必要がある良い例だと思います。多数の項目を含むリストを使用していて、アプリケーションを使用するたびにcontainsメソッドを呼び出すと、問題が発生する可能性があります。
私が考えることができる改善の1つは、二分探索を使用することです。アイテムがソートされている場合のみ。したがって、データベースからアイテムを追加/照会するとき、またはアプリケーションの起動時にdbオーダーを使用しないときに、アイテムをオーダーする必要があります。
特定のシナリオに別のコレクションを使用する方が良いですか、それともutilクラスの1つを使用してArrayListを検索しますか?