Arrays asList Integer

Arrays.asList[T... a]は、実際のオブジェクト(Objectのサブクラス)の配列と一致する_T[]_を配列として効果的に受け取ります。プリミティブ型はObjectから派生しないため、このように一致しないのはプリミティブの配列だけです。したがって、_int[]_は_Object[]_ではありません。

次に起こるのは、varagsメカニズムが起動し、1つのオブジェクトを渡したかのように扱い、そのタイプの1つの要素配列を作成することです。したがって、_int[][]_(ここで、Tは_int[]_)を渡し、最終的に1要素の_List_が必要になります。

ただし、かなり良いオプションがいくつかあります。

グアバのInt.asList[int[]]アダプター

プロジェクトで既にグアバを使用している場合は、グアバが提供するアダプターを使用するのと同じくらい簡単です: Int.asList() 。関連するクラスの各プリミティブ型に同様のアダプタがあります。たとえば、Booleansの場合はbooleanなどです。

_int foo[] = {1,2,3,4,5}; Iterable 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_が必要な場合は、stream.boxed[].collect[Collectors.toList[]]を ここに推奨 として使用できます。そのアプローチの欠点は、リスト内のすべての要素を完全にボックス化することです。これにより、メモリフットプリントがほぼ1桁増加し、ボックス化されたすべての要素を保持する新しい_Object[]_が作成されます。後でリストを頻繁に使用し、Integersではなくintオブジェクトが必要な場合、これは報われることがありますが、注意が必要です。

Video liên quan

Chủ Đề