プリミティブintのリストを作成しますか?


94

次のようにJavaでプリミティブintまたはプリミティブのリストを作成する方法はありますか?

List<int> myList = new ArrayList<int>();

できるようです List myList = new ArrayList();

このリストに「int」を追加します。しかし、これは、このリストに何でも追加できることを意味します。

私の唯一のオプションは、intの配列を作成し、それをリストに変換するか、Integerオブジェクトのリストを作成することですか?


パフォーマンスが気になる場合は、troveが役立ちます。
アッシリア2013

基本的な配列を使用してリストを作成することは可能ですが、最初に配列のサイズを知っている必要があり、Collectionsオブジェクトに付属する他の多くの機能が失われます。しかし、あなたは次のようなことをすることができます:int [] array = new int [10];
テイラー

回答:


141

Javaでは、変数の型はプリミティブ型または参照型のいずれかです。ジェネリック型の引数は参照型でなければなりません。プリミティブは拡張しないObjectため、パラメーター化された型のジェネリック型引数として使用できません。

代わりにInteger、ラッパーであるクラスを使用しますint

List<Integer> list = new ArrayList<Integer>();

Java 7を使用している場合は、ひし形演算子を使用してこの宣言を簡略化できます。

List<Integer> list = new ArrayList<>();

JavaのオートボクシングでintInteger、必要なときにプリミティブ型がになります。

自動ボクシングは、Javaコンパイラーがプリミティブ型とそれに対応するオブジェクトラッパークラスの間で行う自動変換です。

したがって、以下は有効です。

int myInt = 1;
List<Integer> list = new ArrayList<Integer>();
list.add(myInt);

System.out.println(list.get(0)); //prints 1

JTableのメソッドsetSelectedIndicesので、非感がある:docs.oracle.com/javase/8/docs/api/javax/swing/...
vdolez

25

Java Collection Frameworkが使用されている場合、プリミティブ型を含むことができるコレクションはありません。

ただし、TroveColtFastutilGuavaなど、プリミティブ型をサポートする他のJavaコレクションがあります。

Trove Libraryを使用した場合の、intを含むarraylistの例は次のとおりです。

 TIntArrayList list= new TIntArrayList();

このリストのパフォーマンスは、Javaコレクションの整数のArrayListと比較した場合、対応する整数ラッパークラスへのオートボクシング/アンボクシングが必要ないため、はるかに優れています。


1
Guavaでプリミティブコレクションの実装を見つけることができませんでした。リンクを提供していただけますか?
nimcap 2014

9

Javaでプリミティブintまたはプリミティブのリストを作成する方法はありますか

いいえ、できません。あなただけのような参照型のリストを作成することができIntegerStringまたはカスタムタイプ。

List myList = new ArrayList();このリストに「int」を追加できるようです。

intこのリストに追加すると、Integerラッパータイプに自動的にボックス化されます。しかし、新しいコードでは、生の型リスト、またはそのための総称型を使用することはお勧めできません。

このリストには何でも追加できます。

もちろん、これはrawタイプを使用する場合の欠点です。CatDogTigerDinosaurをすべて1つのコンテナに収めることができます。

私の唯一のオプションは、intの配列を作成し、それをリストに変換することです

その場合も、あなただけがもらえますList<Integer>List<int>プリミティブを作成する方法はありません。

とにかく気にしないでください。でもList<Integer>intプリミティブ型を追加できます。以下の例のように、自動的にボックス化されます。

List<Integer> list = new ArrayList<Integer>();
list.add(5);

生のタイプの良い議論。
Kevin Bowersox 2013

実際には、明確にするために、基本的な配列を使用するだけでプリミティブ型のリストを作成できます。int [] array = new int [10];
テイラー

1
@テイラーしかし、それは動的に増加するリストにはなりません。それは配列です。そして、私はOPがすでにそれについて知っていると思います。
Rohit Jain


5

これは不可能です。Java仕様では、ジェネリックスでのプリミティブの使用を禁止しています。しかし、あなたが作成できるArrayList<Integer>と呼んでadd(i)あればiintはボクシングのおかげです。


4

Eclipseコレクションで利用可能なプリミティブコレクションを使用できます。EclipseのコレクションがありListSetBagおよびMapすべてのプリミティブのために。プリミティブコレクションの要素はプリミティブとして維持され、ボックス化は行われません。

IntList次のように初期化できます。

MutableIntList ints = IntLists.mutable.empty();

a List<Integer>から次のIntListように変換できます。

List<Integer> integers = new ArrayList<>();
MutableIntList ints = ListAdapter.adapt(integers).collectInt(each -> each);

注:私はEclipseコレクションの寄稿者です。


2

コレクションは、参照型またはワイルドカードをサポートするジェネリックを使用します。ただし、Integerラッパーを使用できます

List<Integer> list = new ArrayList<>();

0

あなたがAndroidの開発のためのJavaを使用する場合は、使用することをお勧めしますSparseIntArray間のオートボクシング防ぐためにintInteger

詳細についてSparseIntArray、Android開発者向けドキュメントと、Androidでのオートボクシングの適切な説明を参照してください。ここにリンクの説明を入力してください


それは強い声明です。確かSparseIntArrayに多くの場合より良いオプションですが、注意するべきトレードオフがあります。「この実装は、多数のアイテムを含む可能性のあるデータ構造に適切であるようには意図されていません。通常、従来のHashMapよりも低速です...」
Andy Thomas

はい、そうです。彼らは私がリンクしたビデオでかなり良いこのトレードオフをカバーしています。しかし、OPはその特定の可能性を求めました。私は、それが実際にAndroidで可能であり、ほとんどのユースケースにも推奨されていることを追加したいと思います。その情報を追加してくれてありがとう!
Stefan Medack

0

Integer []配列をint []配列に変換する方法はありますか?

このJavaコアライブラリの大幅な省略は、私がこれまで取り組んだほとんどすべてのプロジェクトで発生するようです。そして、Troveライブラリーが便利であるように、LGPLライブラリーを静的にリンクするAndroidアプリのLPGLを満たすための正確な要件を解析することはできません(プリアンブルは大丈夫と言っていますが、ボディは同じことを言っていないようです)。そして、これらのクラスを取得するために、Apacheのソースを簡単に削除するのは、非常に不便です。もっと良い方法があるはずです。


-4

Javaコレクションはオブジェクトのみのコレクションである必要があります。

List<Integer> integerList = new ArrayList<Integer>();

整数は、プリミティブデータ型intのラッパークラスです。

JAVAラッパークラスの詳細は こちら

Uは、integerListとの間でintを直接保存および取得できます。 integerList.add(intValue); int intValue = integerList.get(i)


1
最初の行はコンパイルされず、最後の2行のコードはどこにでもあります。これはご遠慮ください。
The_Martian 2015年
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.