【问题标题】:Create a List of primitive int?创建一个原始 int 列表?
【发布时间】:2013-08-03 23:30:20
【问题描述】:

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

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

看来我可以List myList = new ArrayList();

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

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

【问题讨论】:

  • 如果您关心性能,那么 trove 应该会有所帮助。
  • 可以使用基本数组创建列表,但您必须知道数组的大小才能开始,并且您将失去 Collections 对象附带的许多其他功能.但你可以这样做: int[] array = new int[10];
  • long 需要 8Bytes,Long 需要 8Bytes 加上 Object header 的 16Bytes(在 64 位系统中)。很遗憾,没有原始列表。大型数据集应始终作为基元...

标签: java list generics collections


【解决方案1】:

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

改为使用Integer 类,它是int 的包装器:

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

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

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

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

自动装箱是 Java 编译器进行的自动转换 在原始类型及其对应的对象包装器之间 类。

所以以下是有效的:

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

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

【讨论】:

【解决方案2】:

Java Collection 只能是 Object 的集合。

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

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

更多来自 JAVA 包装类 here!

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

【讨论】:

  • 第一行无法编译,最后两行代码到处都是。请不要这样做。
【解决方案3】:

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

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

【讨论】:

    【解决方案4】:

    尝试使用 apache 框架中的 ArrayIntList。它的工作原理与 arraylist 完全一样,只是它可以保存原始 int。

    更多细节在这里-

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

    【讨论】:

      【解决方案5】:

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

      您可以像这样初始化IntList

      MutableIntList ints = IntLists.mutable.empty();
      

      您可以像这样从List&lt;Integer&gt; 转换为IntList

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

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

      【讨论】:

        【解决方案6】:

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

        Java 核心库的这种严重遗漏似乎几乎出现在我从事过的每个项目中。尽管 Trove 库可能很方便,但对于静态链接 LGPL 库的 Android 应用程序,我无法解析满足 LPGL 的精确要求(序言说好的,正文似乎不一样)。而且,为了获取这些类,去剥离 Apache 源代码是很不方便的。必须有更好的方法。

        【讨论】:

          【解决方案7】:

          在使用Java进行Android开发时,建议使用SparseIntArray,以防止intInteger之间自动装箱。

          您可以在the Android Developers documentation 中找到SparseIntArray 的更多信息,以及在Android enter link description here 上自动装箱的一个很好的解释

          【讨论】:

          • 这是一个强有力的声明。当然SparseIntArray 通常是更好的选择,但需要注意权衡取舍。 “该实现不适用于可能包含大量项目的数据结构。它通常比传统的 HashMap 慢......”
          • 是的,这是真的。他们在我链接的视频中很好地涵盖了这种权衡。但是 OP 要求提供这种特殊的可能性,我只是想补充一点,Android 实际上是可能的,并且也推荐用于大多数用例。感谢您添加这些信息!
          【解决方案8】:

          在使用 Java 集合框架时,没有任何集合可以包含原始类型。

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

          以下是使用 Trove 库时带有整数的数组列表的示例:

           TIntArrayList list= new TIntArrayList();
          

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

          【讨论】:

          • 我在 Guava 中找不到原始集合实现。可以给个链接吗?
          【解决方案9】:

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

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

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

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

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

          当然,这是使用原始类型的缺点。您可以在一个容器中拥有老虎恐龙

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

          在这种情况下,您也只会得到List&lt;Integer&gt;。您无法创建List&lt;int&gt; 或任何原语。

          无论如何,你不应该被打扰。即使在List&lt;Integer&gt; 中,您也可以添加int 原始类型。它将被自动装箱,如下例所示:

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

          【讨论】:

          • 很好地讨论了原始类型。
          • 实际上,需要明确的是,您可以仅使用基本数组来创建具有原始类型的列表。 int[] 数组 = 新的 int[10];
          • @Taylor 但这不会是动态增加的列表。那是一个数组。而且我认为 OP 已经知道这一点。
          【解决方案10】:

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

          【讨论】:

            猜你喜欢
            • 2012-02-02
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2013-11-05
            • 2011-07-01
            相关资源
            最近更新 更多