创建一个原始int列表?

时间:2013-08-02 15:52:12

标签: java list generics collections

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

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

似乎我可以做List myList = new ArrayList();

并添加&#34; int&#34;进入这个列表。但这意味着我可以在此列表中添加任何内容。

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

11 个答案:

答案 0 :(得分:114)

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

而是使用Integer类,它是int

的包装器
List<Integer> list = new ArrayList<Integer>();

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

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

在Java中使用自动装箱时,基本类型int将在必要时变为Integer

  

Autoboxing是Java编译器自动转换   原始类型与其对应的对象包装器之间   类。

以下是有效的:

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

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

答案 1 :(得分:23)

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

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

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

 TIntArrayList list= new TIntArrayList();

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

答案 2 :(得分:9)

  

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

不,你不能。您只能创建参考类型列表,例如IntegerString或自定义类型。

  

似乎我可以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);

答案 3 :(得分:6)

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

此处有更多详情 -

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

答案 4 :(得分:5)

这是不可能的。 java规范禁止在泛型中使用原语。但是,如果ArrayList<Integer>是一个int,则可以创建add(i)并调用i,这要归功于拳击。

答案 5 :(得分:4)

您可以使用Eclipse Collections中提供的原始集合。 Eclipse集合对所有基元都有ListSetBagMap。原始集合中的元素作为基元维护,不会发生装箱。

您可以像这样初始化IntList

MutableIntList ints = IntLists.mutable.empty();

您可以将List<Integer>转换为IntList,如下所示:

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

注意:我是Eclipse Collections的撰稿人。

答案 6 :(得分:2)

集合使用支持reference types或wilcards的泛型。但是,您可以使用Integer包装器

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

答案 7 :(得分:0)

  

有没有办法将Integer []数组转换为int []数组?

Java核心库的这种遗漏似乎几乎出现在我曾经工作的每个项目上。和Trove库一样方便,我无法解析为静态链接LGPL库的Android应用程序满足LPGL的精确要求(序言说好,机构似乎没有说同样)。而且,通过剥离和剥离Apache源来获取这些类是非常不方便的。必须有更好的方法。

答案 8 :(得分:0)

当您使用Java进行Android开发时,建议使用SparseIntArray来阻止intInteger之间的自动装箱。

您可以在the Android Developers documentation中向SparseIntArray提供更多信息,并在Android enter link description here

上自动添加自动装箱的详细说明

答案 9 :(得分:-2)

此外,在我最近发表的Baeldung文章中,您可以很好地总结List of Primitive Integer Values in Java

答案 10 :(得分:-4)

Java Collection应该只是Object的集合。

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

Integer是原始数据类型int的包装类。

更多来自JAVA包装类 here

U可以直接保存并从integerList获取int,因为, integerList.add(intValue); int intValue = integerList.get(i)