在Java中将int []转换为List <Integer>的最佳方法是什么?

38

这个问题的第二部分有什么原因吗?我编辑掉它之前。 - DJClayworth
@DJClayworth:我认为不是。我已经标记了这个问题,并解释了我在提交这个问题时遇到了一些困难。 - Roman
1
@Merlyn:不是重复。原始数组与对象数组不同。 - Alexander Pogrebnyak
@Alexander:哇,太恶心了 :) 我不能撤回我的投票,所以我会删除我的评论。 - Merlyn Morgan-Graham
这不是给定问题的重复,而是 https://dev59.com/P3NA5IYBdhLWcg3wI6V4 的重复。 - M. Justin
6个回答

9

很可能有一个内置方法可以实现这个功能*(正如你所指出的,Arrays.asList不能工作,因为它期望一个Integer[]而不是int[])。

我不太了解Java库,无法告诉你在哪里找到它。但编写自己的方法非常简单:

public static List<Integer> createList(int[] array) {
    List<Integer> list = new ArrayList<Integer>(array.length);
    for (int i = 0; i < array.length; ++i) {
        list.add(array[i]);
    }
    return list;
}

显然,这样做的一个缺点是你不能通用地实现它。你需要为每种自动装箱的原始类型编写单独的 createList 方法。 *如果没有,我真的很想知道为什么没有。

1
出于效率考虑,我建议使用 new ArrayList<Integer>(array.length)。这样可以避免Java在添加元素时重新调整集合大小。 - cHao

2
List<Integer> asList(final int[] integers) {
    return new AbstractList<Integer>() {
        public Integer get(int index) {
            return integers[index];
        }

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

1
有几个大问题:(1)列表由数组支持 - 也就是说,如果数组元素更改,列表元素也会更改。(2)对于较大的整数,每次都会返回不同的Integer - 也就是说,您不能有任何引用相等的期望。那两个可能是问题,也可能不是问题,但它们是半惊喜的行为。在我添加(3)之前,Java可以像那样进行闭包吗? - cHao
@cHao:是的,Java可以像那样使用闭包! - Alexander Pogrebnyak
1
从技术上讲,如果假设Java在这方面遵循与.NET相同的命名约定(as提供了对同一集合的不同类型视图,而to则实际执行转换),那么这应该被命名为as List。 - Joey
2
这些不是闭包。它们是匿名类。 - Senthess
1
@Christoffer,啊,是的,那就没有问题了:我以为add(...)是在AbstractList中实现的。我的错,谢谢你提供的信息! - Bart Kiers
显示剩余8条评论

2

使用commons-lang3 org.apache.commons.lang3.ArrayUtils.toObject(<你的整型数组>),然后再用java.util.Arrays.asList(<>)

ArrayUtils.toObject()复制该数组,而Arrays.asList()只是创建一个由新数组支持的列表。

int[] a = {1, 2, 3};
List<Integer> aI = Arrays.asList(ArrayUtils.toObject(a));

编辑:如果您想通过列表接口调整大小添加()新元素,则此方法无效。如果您想能够添加新元素,可以使用new ArrayList(),但这将创建一个副本。


你可以直接使用 List<Integer> xValues = Arrays.asList(new Integer[] { 150, 160, 175, 165, 165 }); 来完成。 - Alexander Pacha
@AlexanderPacha 当然,它可以使用Integer[]字面量工作,但不能使用现有的int[]。它无法放置在OP的方法框架中。 - Dávid Horváth

1
List<Integer> toList(int[] integers) {
    // Initialize result's size to length of the incoming array
    // this way it will not require reallocations
    ArrayList<Integer> result = new ArrayList<Integer>( integers.length );

    for ( int cur: integers )
    {
        result.add( Integer.valueOf( cur ) );
    }

    return result;
}

0
import java.util.Arrays;
import java.util.ArrayList;
import java.util.List;

public class Listing {
  public static void main(String[] args) {

   int[] integers = {1,2,3,4};

   java.util.List<Integer> list = new ArrayList<Integer>();
  for (int i=0; i< integers.length; i++)
  {
      list.add(integers[i]);
  }
  System.out.println(list);
}
}

测试完成,符合预期!


0

很遗憾,我认为没有快速的方法来做到这一点。我相信你将不得不迭代数组并逐个添加。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接