4

これらの手順では、パフォーマンスとメモリ使用量の点でどちらが優れていますか:

if(val.equals(CONSTANT1) || val.equals(CONSTANT2) ..... || val.equals(CONSTANTn)) {

}

また

if(Arrays.asList(CONSTANT1,CONSTANT2, ..... ,CONSTANTn).contains(val)) {

}
4

4 に答える 4

2

より適切な質問は、このコードをより明確に (パフォーマンスが実際に問題になる場合はより速く) 記述する方法です。それに対する答えは、switchステートメント (または、定数を列挙型に変換する場合はポリモーフィズム) またはルックアップ配列になります。

ただし、2 つのアプローチを比較することを主張する場合、最初のアプローチの方がわずかに高速です。これを確認するために、2 番目のアプローチに伴う内容を見てみましょう。

  1. 定数を含む新しい配列を作成し、それらを Arrays.asList の vararg パラメータに渡します
  2. その配列をラップする新しいリスト オブジェクトを作成する
  3. その配列を繰り返し処理し、各要素を equals と比較します

3 番目のステップは、最初のアプローチと同じです。

最後に、このような操作にかかる時間は 1 マイクロ秒未満である可能性が高いことに注意してください。したがって、このメソッドを 1 秒間に何百万回も呼び出さない限り、どのアプローチでも十分に高速です。

于 2014-02-01T13:02:54.090 に答える
2

理論的には #1 の方が高速ですが、重要ではありません。Arrays.asList は、指定された配列のリスト ビュー (ラッパー) という 1 つのオブジェクトのみを作成するため、配列のコピーはありません。

public static <T> List<T> asList(T... a) {
return new ArrayList<T>(a);
}

private static class ArrayList<E> extends AbstractList<E>
implements RandomAccess, java.io.Serializable
{
    private static final long serialVersionUID = -2764017481108945198L;
private final E[] a;

ArrayList(E[] array) {
        if (array==null)
            throw new NullPointerException();
    a = array;
}
于 2013-02-19T10:55:12.333 に答える
1

ループを使用していないため、値の数が非常に少ないため、実際には違いは関係ないと思います。

ただし、そうは言っても、手動で反復して equals() と asList() および contains() を使用する場合は、同じです。

Arrays.asList() は、AbstractList を拡張し、参照によって既存の配列をラップするだけのリストのプライベート実装を返します (コピーは行われません)。contains() メソッドは indexOf() を使用します。これは、一致する要素が見つかるまで各要素に対して equals() を使用して配列を調べ、それを返します。等号を見つけたときにループを中断する場合、両方の実装はまったく同等になります。

唯一の違いは、それ以外に、Arrays.asList() が作成する追加のリスト構造の小さなメモリ フットプリントです...

于 2013-02-19T10:55:48.160 に答える
0

if(val.equals(CONSTANT1) || val.equals(CONSTANT2) ..... || val.equals(CONSTANTn)) {

}

2番目のものはリストを作成し、そのリストでvalの検索を開始するのに時間がかかるため、パフォーマンスとメモリの点で優れています。ここでは、リストを維持するために余分なメモリが必要であり、リストを反復処理するために余分な時間が費やされます.val と定数の比較では、短絡比較アプローチが使用されます。

于 2013-02-19T10:48:45.300 に答える