Arrays.asList(T... a)
事実上T[]
、真のオブジェクト(のサブクラスObject
)の任意の配列に一致するを配列として受け取ります。プリミティブ型はから派生しないため、そのように一致しないのはプリミティブの配列だけですObject
。したがって、int[]
はではありませんObject[]
。
次に何が起こるかというと、varagsメカニズムが起動し、それを単一のオブジェクトを渡したかのように扱い、そのタイプの単一の要素配列を作成します。int[][]
したがって、 (ここでT
は、)を渡してint[]
、最終的に1要素List<int[]>
になります。これは必要なものではありません。
ただし、まだかなり良いオプションがいくつかあります。
グアバのInt.asList(int[])
アダプター
プロジェクトですでにguavaを使用している場合は、Guavaが提供するアダプター Int.asList()を使用するのと同じくらい簡単です。関連するクラスのプリミティブ型ごとに同様のアダプタがあります。たとえば、Booleans
などですboolean
。
int foo[] = {1,2,3,4,5};
Iterable<Integer> fooBar = Ints.asList(foo);
for(Integer i : fooBar) {
System.out.println(i);
}
このアプローチの利点は、既存のアレイの周りに薄いラッパーを作成することです。そのため、ラッパーの作成は一定時間であり(アレイのサイズに依存しません)、必要なストレージはごくわずかな一定量です(基になる整数配列に加えて、100バイト未満)。
欠点は、各要素にアクセスするには、基になるのボックス化操作が必要int
であり、設定にはボックス化解除が必要なことです。これにより、リストに頻繁にアクセスすると、一時的なメモリ割り当てが大量に発生する可能性があります。平均して各オブジェクトに何度もアクセスする場合は、オブジェクトを1回ボックス化して、として保存する実装を使用する方がよい場合がありますInteger
。以下の解決策はそれを行います。
Java 8 IntStream
Java 8では、このArrays.stream(int[])
メソッドを使用してint
配列をに変換できStream
ます。ユースケースによっては、ストリームを直接使用できる場合があります。たとえば、。を使用して各要素で何かを行うことができますforEach(IntConsumer)
。その場合、このソリューションは非常に高速であり、ボックス化またはボックス化解除をまったく行わず、基になるアレイのコピーを作成しません。
または、本当に必要な場合は、ここで提案されているように使用List<Integer>
できます。このアプローチの欠点は、リスト内のすべての要素を完全にボックス化することです。これにより、メモリフットプリントがほぼ一桁増加する可能性があり、ボックス化されたすべての要素を保持するための新しい要素が作成されます。その後、リストを頻繁に使用し、 sではなくオブジェクトが必要な場合、これは効果があるかもしれませんが、注意する必要があります。stream.boxed().collect(Collectors.toList())
Object[]
Integer
int