创建一个原始int列表?

Sus*_*sie 77 java generics collections list

有没有办法在java中创建原始int或任何基元的列表,如下所示?

List<int> myList = new ArrayList<int>();
Run Code Online (Sandbox Code Playgroud)

看来我能做到 List myList = new ArrayList();

并在此列表中添加"int".但这意味着我可以在此列表中添加任何内容.

是我唯一的选择,创建一个int数组并将其转换为列表或创建一个Integer对象列表?

Kev*_*sox 124

在Java中,任何变量的类型都是基本类型或引用类型.通用类型参数必须是引用类型.由于基元不扩展,Object因此它们不能用作参数化类型的泛型类型参数.

而是使用Integer作为包装器的类int:

List<Integer> list = new ArrayList<Integer>();
Run Code Online (Sandbox Code Playgroud)

如果您使用Java 7,则可以使用菱形运算符简化此声明:

List<Integer> list = new ArrayList<>();
Run Code Online (Sandbox Code Playgroud)

使用Java中的自动装箱,原始类型intInteger在必要时成为必要的.

自动装箱是Java编译器在基元类型和相应的对象包装类之间进行的自动转换.

所以以下是有效的:

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

System.out.println(list.get(0)); //prints 1
Run Code Online (Sandbox Code Playgroud)


Mik*_*e B 23

在使用Java Collection Framework时,没有任何可以包含基本类型的集合.

但是,还有其他支持原始类型的java集合,例如:Trove,Colt,Fastutil,Guava

使用Trove Library时如何使用int的arraylist的示例如下:

 TIntArrayList list= new TIntArrayList();
Run Code Online (Sandbox Code Playgroud)

与Java Collections中的整数ArrayList相比,此列表的性能要好得多,因为不需要对相应的Integer Wrapper类进行自动装箱/拆箱.

  • 我在 Guava 中找不到原始集合实现。您能提供一个链接吗? (3认同)

Roh*_*ain 9

有没有办法在java中创建原始int或任何基元的列表

不,你不能.您只能创建引用类型,喜欢的列表Integer,String或您的自定义类型.

我似乎可以这样做List myList = new ArrayList();并在此列表中添加"int".

当您添加int到此列表时,它会自动装箱到Integer包装类型.但是在较新的代码中使用原始类型列表或任何泛型类型是一个坏主意.

我可以在此列表中添加任何内容.

当然,这是使用原始类型的缺点.你可以将Cat,Dog,Tiger,Dinosaur放在一个容器中.

是我唯一的选择,创建一个int数组并将其转换为列表

在那种情况下,你只会得到一个List<Integer>.您无法创建List<int>任何基元.

不管怎么说,你不应该被打扰.即使在List<Integer>你可以添加int原始类型.它会自动装箱,如下例所示:

List<Integer> list = new ArrayList<Integer>();
list.add(5);
Run Code Online (Sandbox Code Playgroud)

  • @Taylor 但这不会是动态增加的列表。那是一个数组。我想 OP 已经知道这一点了。 (2认同)

sto*_*ves 6

尝试使用apache框架中的ArrayIntList.它的工作方式与arraylist完全相同,只不过它可以保存原始int.

更多细节 -

https://commons.apache.org/dormant/commons-primitives/apidocs/org/apache/commons/collections/primitives/ArrayIntList.html


ζ--*_*ζ-- 5

这是不可能的.java规范禁止在泛型中使用原语.但是,由于拳击,你可以创建ArrayList<Integer>并调用add(i)if i是否为int.


Rei*_*eus 5

集合使用支持引用类型或通配符的泛型。但是您可以使用Integer包装器

List<Integer> list = new ArrayList<>();
Run Code Online (Sandbox Code Playgroud)


Nik*_*kar 5

您可以使用Eclipse Collections中提供的原始集合。Eclipse Collections 有ListSetBagMap。原始集合中的元素被维护为原始并且不发生装箱。

您可以像这样初始化IntList :

MutableIntList ints = IntLists.mutable.empty();
Run Code Online (Sandbox Code Playgroud)

您可以像这样从 a 转换List<Integer>IntList

List<Integer> integers = new ArrayList<>();
MutableIntList ints = ListAdapter.adapt(integers).collectInt(each -> each);
Run Code Online (Sandbox Code Playgroud)

注意:我是 Eclipse Collections 的贡献者。