Javaのプリミティブ整数値のリスト

1. 概要

このチュートリアルでは、*プリミティブ整数値を含むリストを作成する方法を学習します*。
コアJavaと外部ライブラリを使用したソリューションを検討します。

2. オートボクシング

Javaでは、https://www.baeldung.com/java-generics [generic type]引数は参照型である必要があります。 *これは、_List <int> _のようなことはできないことを意味します。*
代わりに、_List <Integer> _を使用してオートボクシングを利用できます。 link:/java-wrapper-classes[Autoboxing]は、_List <Integer> _インターフェースをプリミティブ_int_値が含まれているかのように使用するのに役立ちます。 内部では、_Objects_のコレクションであり、プリミティブではありません。
コアJavaソリューションは、justgeneric link:/java-collections[collections]でプリミティブを使用できるようにするための単なる調整です。 さらに、*ボックス化およびボックス化解除の変換のコストが伴います*。
ただし、Javaには他のオプションや、使用できるサードパーティライブラリがあります。 以下にそれらの使用方法を見てみましょう。

*3. Stream API *を使用する

*多くの場合、リストを操作するだけでよいので、実際にリストを作成する必要はありません*。
これらの場合、リスト全体を作成する代わりに、Java 8のlink:/java-8-streams-introduction[Stream API]を使用することで機能する場合があります。 * _IntSream_クラスは、順次集約操作をサポートするプリミティブ_int_要素のシーケンスを提供します。*
例を見てみましょう。
IntStream stream = IntStream.of(5, 10, 0, 2, -8);
_IntStream.of()_ _static_メソッドは、順次の_IntStream_を返します。
同様に、_ints_の既存の配列から_IntStream_を作成できます。
int[] primitives = {5, 10, 0, 2, -8};
IntStream stream = IntStream.of(primitives);
さらに、標準のStream API操作を適用して、_ints_を繰り返し、フィルター処理し、集約することができます。 たとえば、正の_int_値の平均を計算できます。
OptionalDouble average = stream.filter(i -> i > 0).average();
最も重要なのは、ストリームの操作中に*オートボクシングが使用されない*ことです。
ただし、具体的なリストが必要な場合は、次のサードパーティライブラリのいずれかをご覧ください。

*4. Trove *を使用する

  • Troveは、Java *の基本コレクションを提供する高性能ライブラリです。

    TroveをMavenでセットアップするには、_pom.xml_にhttps://search.maven.org/search?q=net.sf.trove4j%20trove4j[the __trov4j __dependency]を含める必要があります。
<dependency>
    <groupId>net.sf.trove4j</groupId>
    <artifactId>trove4j</artifactId>
    <version>3.0.2</version>
</dependency>
Troveを使用すると、*リスト、マップ、およびセットを作成できます*。
たとえば、___ nt_値のリストを操作するために、___ ntntArrayList_実装を備えた___ntntList_インターフェイスがあります。
TIntList tList = new TIntArrayList();
_TIntList_は_List_を直接実装することはできませんが、メソッドは非常に類似しています。 ここで説明する他のソリューションも同様のパターンに従います。
  • _TIntArrayList_を使用する最大の利点は、パフォーマンスとメモリ消費の増加です*。 _int [] _配列内にデータを保存するため、追加のボクシング/アンボクシングは不要です。

*5. Fastutil *を使用する

プリミティブを操作する別の高性能ライブラリは、http://fastutil.di.unimi.it/ [Fastutil]です。 https://search.maven.org/search?q=it.unimi.dsi%20fastutil[_fastutil_dependency]を追加しましょう。
<dependency>
    <groupId>it.unimi.dsi</groupId>
    <artifactId>fastutil</artifactId>
    <version>8.1.0</version>
</dependency>
これで、使用する準備ができました。
IntArrayList list = new IntArrayList();
*デフォルトのコンストラクタ_IntArrayList()_は、デフォルトの容量16でプリミティブの配列を内部的に作成します*。 同様に、既存の配列から初期化できます。
int[] primitives = new int[] {5, 10, 0, 2, -8};
IntArrayList list = new IntArrayList(primitives);

*6. Colt *を使用する

  • https://dst.lbl.gov/ACSSoftware/colt/api/index.html [Colt]はオープンソースで、科学技術計算用の高性能ライブラリ*です。 _cern.colt_パッケージには、 `int.`などのプリミティブデータ型を保持するサイズ変更可能なリストが含まれています。

    まず、https://search.maven.org/search?q = colt%20colt [_colt_dependency]を追加しましょう。
<dependency>
    <groupId>colt</groupId>
    <artifactId>colt</artifactId>
    <version>1.2.0</version>
</dependency>
このライブラリを提供するプリミティブリストは、_cern.colt.list.IntArrayList:_です。
cern.colt.list.IntArrayList coltList = new cern.colt.list.IntArrayList();
デフォルトの初期容量は10です。

*7. Guava *を使用する

  • https://www.baeldung.com/whats-new-in-guava-18 [Guava]は、プリミティブ配列とコレクションAPIの間のインターフェースをとるいくつかの方法を提供します*。 _com.google.common.primitives_パッケージには、プリミティブ型に対応するためのすべてのクラスが含まれています。

    たとえば、_ImmutableIntArray_クラスを使用すると、_int_要素の不変リストを作成できます。
    _int_値の次の配列があるとします。
int[] primitives = new int[] {5, 10, 0, 2};
配列を使用して単純にリストを作成できます。
ImmutableIntArray list = ImmutableIntArray.builder().addAll(primitives).build();
さらに、期待されるすべての標準メソッドを備えたリストAPIを提供します。

8. 結論

この簡単な記事では、*原始整数でリストを作成する複数の方法を示しました*。 *この例では、Trove、Fastutil、Colt、およびGuavaライブラリを使用しました*。
いつものように、この記事の完全なコードはhttps://github.com/eugenp/tutorials/tree/master/core-java-modules/core-java-collections-list-3 [GitHub]にあります。