400 個の型を受け入れ、実行時の条件に応じてそれらの一部を変更するプログラムを作成しています。またはlong
を使用するかどうかを知りたいです。ArrayList<Long>
long[]
どちらがより速く使用できますか? long[]
サイズが決まったので使おうと思っています。
400 個の型を受け入れ、実行時の条件に応じてそれらの一部を変更するプログラムを作成しています。またはlong
を使用するかどうかを知りたいです。ArrayList<Long>
long[]
どちらがより速く使用できますか? long[]
サイズが決まったので使おうと思っています。
他の回答で言及されていないことがいくつかあります。
ジェネリックコレクションは、実際にはObject
sのコレクションであり、より適切に言えば、これはJavaコンパイラが作成するものです。これは、long[]
常にそれが何であるかを維持する間です。
最初の箇条書きの結果は、最終的にコレクションに他の何かを入れるようなことをした場合Long
、特定の状況ではコンパイラがそれを通過させることです(Java型システムは健全ではないため、つまり例として、アップキャストしてから、完全に異なるタイプに再キャストします)。
これら2つのより一般的な結果は、Javaジェネリックが中途半端であり、リフレクション、シリアル化などの些細なケースでは「驚かれる」可能性があることです。実際には、プレーン配列を使用してからジェネリックを使用する方が安全です。
package tld.example;
import java.util.List;
import java.util.ArrayList;
class Example {
static void testArray(long[] longs) {
System.out.println("testArray");
}
static void testGeneric(List<Long> longs) {
System.out.println("testGeneric");
}
@SuppressWarnings("unchecked")
public static void main(String... arguments) {
List<Long> fakeLongs = new ArrayList<Long>();
List<Object> mischiefManaged = (List<Object>)(Object)fakeLongs;
mischiefManaged.add(new Object());
// this call succeeds and prints the value.
// we could sneak in a wrong type into this function
// and it remained unnoticed
testGeneric(fakeLongs);
long[] realLongs = new long[1];
// this will fail because it is not possible to perform this cast
// despite the compiler thinks it is.
Object[] forgedLongs = (Object[])(Object)realLongs;
forgedLongs[0] = new Object();
testArray(realLongs);
}
}
この例は、短い説得力のある例を思い付くのが難しいため、少し工夫されていますが、それほど些細なことではありませんが、反射や安全でないキャストを使用する必要がある場合は、これはかなりの可能性です。
今、あなたは合理的なものに加えて、伝統があることを考慮しなければなりません。すべてのコミュニティには、一連の習慣と伝統があります。ここで表明されているような表面的な信念がたくさんあります。APIの実装は無条件の良さであると誰かが主張しList
、これが起こらなければ、それは悪いことであるに違いありません...これは単なる支配的な意見ではなく、圧倒的多数のJavaプログラマーが信じていることです。それほど重要ではありません。Javaには他にも多くの欠点があるため、仕事の面接を確保したり、他のJavaプログラマーとの競合を避けたい場合は、理由に関係なくJavaジェネリックを使用してください。 。しかし、それが気に入らない場合は、おそらく他の言語を使用してください;)
long[] は、はるかに高速であり、メモリ使用量もはるかに少なくなります。「Effective Java」を読む 項目 49: 「ボックス化されたプリミティブよりもプリミティブ型を優先する」
私は ArrayList を使用する方が良いと思います。なぜなら、長期的には維持するのがはるかに簡単だからです。将来、配列のサイズが 400 を超えて増加した場合、long[] を維持すると多くのオーバーヘッドが発生しますが、ArrayList は動的に成長するため、サイズの増加について心配する必要はありません。
また、要素の削除は、静的配列 (long[]) よりも ArrayList の方がはるかに優れた方法で処理されます。配列された要素として表示されるように要素が自動的に再編成されるからです。これに関しては、静的配列の方が悪いです。