【问题标题】:Convert int[] into ArrayList [duplicate]将 int[] 转换为 ArrayList [重复]
【发布时间】:2012-05-03 09:37:18
【问题描述】:

int[] 数组元素重新复制到ArrayList 的最佳方法是什么?

我需要快速完成此操作,那么最快的方法是什么?

【问题讨论】:

  • 嗯,Arrays.asList 还不够吗?
  • “我需要快速执行此操作” 快速输入代码还是快速执行?后者应该在运行时进行测试,但考虑到似乎对这个问题进行了大量的思考/研究,我怀疑你的意思是前者。

标签: java arrays arraylist


【解决方案1】:

我也会提供一个替代答案,这取决于 List 的使用方式,这可以更好地执行(创建速度更快,并且只有实际使用的 int 被转换,但它们总是被转换,而不仅仅是第一次,所以重复获取相同元素更糟糕)。在数组周围创建一个简单的包装器列表:

final int[] array = {1, 2, 3};
List list = new AbstractList<Integer>() {

     public Integer get(int index) {
       return array[index];
     }

     public Integer set(int index, Integer value) {
       //or just throw new UnsupportedOperationException("..."); if not needed
       Integer old = array[index];
       array[index] = value;
       return old;
     }

     public int size() {
       return array.length;
     }
};

或在为您创建它的方法中:

static List<Integer> asList(final int[] array) {
  return new AbstractList<Integer>() { ...
             };
}

【讨论】:

    【解决方案2】:

    有了Guava,你就不用为Integer[]操心了:

    int[] array;
    List<Integer> list = Ints.asList(array);
    

    如果你想要ArrayList,那就是

    List<Integer> list = Lists.newArrayList(Ints.asList(array));
    

    (披露:我为 Guava 做出了贡献。)

    否则,如果你只有一个int[],你必须用老式的方式来做:

    int[] array;
    List<Integer> list = new ArrayList<>(array.length);
    for (int val : array) {
      list.add(val);
    }
    

    【讨论】:

      【解决方案3】:

      使用Arrays#asList(T... a)创建“由指定数组支持的固定大小列表。(更改返回的列表“写入”到数组。)”

      Integer[] intArray = {1, 2, 3, 42}; // cannot use int[] here
      List<Integer> intList = Arrays.asList(intArray);
      

      或者,解耦两种数据结构:

      List<Integer> intList = new ArrayList<Integer>(intArray.length);
      
      for (int i=0; i<intArray.length; i++)
      {
          intList.add(intArray[i]);
      }
      

      或者更简洁:

      List<Integer> intList = new ArrayList<Integer>(Arrays.asList(intArray));
      

      【讨论】:

      • new ArrayList&lt;Integer&gt;(); 可以是 new ArrayList&lt;Integer&gt;(intArray.length); 以避免重新分配数组
      • Pulsar 有一点:这不起作用,因为Arrays.asList(intArray) 返回List&lt;int[]&gt;。所以看起来我们实际上必须在这里使用循环,或者我们可以以某种方式将int[] 转换为Integer[] 数组?
      • @NiklasB。确实。已编辑; Integer[] 而不是 int[] 可以解决问题。
      • 嗯,是的,但问题是关于一个int[] 数组,具体来说:) 当然,如果它对他/她不起作用,OP 可以跳过第一个样本。
      • @MattBall 你最后的方法真的有效吗?对于List&lt;Integer&gt; li = Arrays.asList(intArray); 我得到Type mismatch: cannot convert from List&lt;int[]&gt; to List&lt;Integer&gt;
      【解决方案4】:

      ArrayList 不是 int 等原语的最佳存储方式。 ArrayList 存储对象而不是基元。有用于带有原语的列表的库。 如果您真的想将所有原始 int 存储为 Integer 对象,则必须使用 Integer.valueOf(...) 将它们一一转换(这样您就不会在不需要时创建额外的 Integer 实例)。

      虽然你可以这样做:

      List<Integer> list = Arrays.asList(1, 2, 3);
      

      你不能这样做:

      int[] i = { 1, 2, 3 };
      List<Integer> list = Arrays.asList(i); // this will get you List<int[]>
      

      因为数组实际上是一个对象,并且在使用 int 等原语时在 var-args 中也被视为对象。对象数组虽然有效:

      List<Object> list = Arrays.asList(new Object[2]);
      

      所以大致如下:

      int[] array = { 1, 2, 3 };
      ArrayList<Integer> list = new ArrayList<Integer>(array.length);
      for (int i = 0; i < array.length; i++)
        list.add(Integer.valueOf(array[i]));
      

      【讨论】:

      • 嗯,你是对的。我想知道为什么没有其他人早先提出这个问题:)
      • 自 Java 1.5 和自动装箱以来,您不再需要执行 Integer.valueOf()。
      • 这是真的@ZeroOne,自动装箱会为我们生成 Integer.valueOf()。
      猜你喜欢
      • 2013-12-03
      • 2014-04-30
      • 2013-10-16
      • 1970-01-01
      • 2012-08-10
      • 2023-03-17
      • 2011-12-09
      • 2014-05-15
      • 1970-01-01
      相关资源
      最近更新 更多