创建原始int列表?


94

有没有一种方法可以创建基本类型int或Java中任何基本类型的列表,如下所示?

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

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

并将“ int”添加到此列表中。但这意味着我可以在此列表中添加任何内容。

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


如果您关心性能,则trove应该会有所帮助。
assylias

可以使用基本数组创建列表,但是您确实必须知道数组的大小,并且您将失去Collections对象附带的许多其他功能。但是您可以执行以下操作:int [] array = new int [10];
2014年

Answers:


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时,没有任何集合可以包含原始类型。

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

下面是一个使用Trove库时具有int数组列表的示例:

 TIntArrayList list= new TIntArrayList();

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


1
我在Guava中找不到原始集合的实现。你能提供一个链接吗?
nimcap 2014年

9

有没有一种方法可以在Java中创建基本类型int或任何基本类型的列表

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

看来我可以做,List myList = new ArrayList();并在此列表中添加“ int”。

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

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

当然,那是使用原始类型的缺点。你可以有TigerDinosaur放在一个容器中。

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

在这种情况下,您也只会得到一个List<Integer>。您无法创建List<int>任何方法或任何原语。

无论如何您都不会打扰。即使List<Integer>您可以添加int原始类型。它将自动装箱,如以下示例所示:

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

很好地讨论了原始类型。
Kevin Bowersox

实际上,要明确一点,您可以仅通过使用基本数组来创建具有基本类型的列表。int [] array = new int [10];
2014年

1
@Taylor但这不会动态增加列表。那是一个数组。我认为OP将已经对此有所了解。
罗希特·贾因


5

这是不可能的。Java规范禁止在泛型中使用基元。但是,由于装箱,您可以创建ArrayList<Integer>并调用add(i)if i是一个int。


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的撰稿人。


2

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

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

0

当您使用Java进行Android开发时,建议使用SparseIntArray来防止int和之间的自动装箱Integer

您可以SparseIntArrayAndroid Developers文档中找到更多信息,并在Android上对自动装箱进行了很好的解释,请在此处输入链接描述


这是一个强有力的声明。当然SparseIntArray,通常这是一个更好的选择,但是要权衡一些注意事项。“该实现不适用于可能包含大量项目的数据结构。它通常比传统的HashMap慢...”
Andy Thomas

是的,这是真的。他们在我链接的视频中很好地介绍了这种折衷方案。但是OP要求这种特殊可能性,我只是想补充一下,Android确实可以实现,并且建议在大多数用例中使用。感谢您添加该信息!
Stefan Medack

0

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

Java核心库中的这一重大遗漏似乎几乎涉及到我从事的每个项目。尽管Trove库可能很方便,但我无法解析确切的要求来满足静态链接LGPL库的Android应用程序的LPGL(序言说还可以,正文似乎不太一样)。剥离Apache源代码来获取这些类是非常不便的。一定有更好的方法。


-4

Java Collection应该仅是Object的集合。

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

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

这里有更多来自JAVA包装器类的 信息

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


1
第一行将不会编译,后两行代码无处不在。请不要这样做。
The_Martian
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.