在Java中将数组转换为列表

1279

如何在Java中将数组转换为列表?

我使用了Arrays.asList(),但其行为(及签名)从Java SE 1.4.2(文档现已存档)到8发生了变化,大多数我在网上找到的代码片段都使用1.4.2的行为。

例如:

int[] numbers = new int[] { 1, 2, 3 };
Arrays.asList(numbers)
  • 在 1.4.2 版本中返回包含元素 1、2、3 的列表
  • 在 1.5.0+ 版本中返回包含数组 'numbers' 的列表

在许多情况下,这应该很容易检测到,但有时它可能会不经意地滑过:

Assert.assertTrue(Arrays.asList(numbers).indexOf(4) == -1);

25
我认为您的示例有问题:Arrays.asList(new int[] { 1, 2, 3 });在Java 1.4.2中绝对无法编译通过,因为一个 int[] 不是一个 Object[]。请注意,这里的关键问题是 int[]Object[] 之间的转换。 - Joachim Sauer
1
哦,你可能是对的。在发布之前,我没有Java 1.4.2编译器来测试我的示例。现在,在你的评论和Joe的回答之后,一切都变得更加清晰明了。 - Alexandru
1
我认为自动装箱应该已经涵盖了从原始类型到包装类 Integer 的转换。您可以先进行强制转换,然后上述 Arrays.asList 代码就可以正常工作了。 - Horse Voice
2
Java 8的Stream.boxed()会处理自动装箱并可用于此。请参见我的答案下面 - Ibrahim Arief
25个回答

0

我开始尝试通过减少为一些测试用例准备输入的代码量来研究这个问题。我看到很多人在努力使用 Arrays.asList() 来包含高级和新功能,但下面的代码是由于其简单性而被选择的:

    //Integer input[]
    List<Integer> numbers = Arrays.asList(new Integer[]{1, 2 ,3, 4, 5, 4, 3, 2, 1, 3, 4});
    
    //String input[]
    List<String> names = Arrays.asList(new String[]{"Jhon", "Lucas", "Daniel", "Jim", "Sam"});
    
    //String input[]
    List<Character> letters = Arrays.asList(new Character[]{'A', 'B', 'K', 'J', 'F'});
    

请注意,匿名数组示例仅适用于非基本类型的数组,因为API使用了泛型,这就是为什么您可以看到周围有几个两行示例的原因,更多信息请参见:为什么Java泛型不支持基本类型? 对于较新的JDK,还有另一个更简单的选项,下面的示例与上面显示的示例等效:
    //Integer
    List<Integer> numbers = Arrays.asList(1, 2 ,3, 4, 5, 4, 3, 2, 1, 3, 4);
    
    //String
    List<String> names = Arrays.asList("Jhon", "Lucas", "Daniel", "Jim", "Sam"); 
    
    //Character
    List<Character> letters = Arrays.asList('A', 'B', 'K', 'J', 'F');

0

int 是一种原始类型。原始类型不能接受 null 值并且有默认值。因此,要接受 null 值,您需要使用包装类 Integer

选项 1:

int[] nos = { 1, 2, 3, 4, 5 };
Integer[] nosWrapped = Arrays.stream(nos).boxed()   
                                        .toArray(Integer[]::new);
nosWrapped[5] = null // can store null

选项2:您可以使用任何使用包装类Integer的数据结构

int[] nos = { 1, 2, 3, 4, 5 };
List<Integer> = Arrays.asList(nos)

1
我正在使用Java 8。第二个例子将无法工作。 - acakojic

0

如果您正在尝试进行内存优化等操作(并且不想引入外部库),那么实现自己的不可变“数组视图列表”比您想象的要简单得多 - 您只需要扩展java.util.AbstractList即可。

class IntArrayViewList extends AbstractList<Integer> {
    int[] backingArray;
    int size;

    IntArrayViewList(int[] backingArray, int size) {
        this.backingArray = backingArray;
        this.size = size;
    }

    public Iterator<Integer> iterator() {
        return new Iterator<Integer>() {
            int i = 0;

            @Override
            public boolean hasNext() {
                return i < size;
            }

            @Override
            public Integer next() {
                return get(i++);
            }
        };
    }

    public int size() {
        return size;
    }

    public Integer get(int i) {
        return backingArray[i];
    }
}

0

你能否改善这个答案,因为这是我使用的内容,但我并不完全清楚。它可以正常运行,但intelliJ添加了新的WeatherStation [0]。为什么是0?

    public WeatherStation[] removeElementAtIndex(WeatherStation[] array, int index)
    {
        List<WeatherStation> list = new ArrayList<WeatherStation>(Arrays.asList(array));
        list.remove(index);
        return list.toArray(new WeatherStation[0]);
    }


为什么我们应该改进你的问题?要么你知道答案,要么你不知道。当然,你应该提供一个真正有帮助而不是更加混淆的答案来帮助其他人。 - MakePeaceGreatAgain

0
有几种方法可以完成这个任务。 而且,根据数据类型的不同,有些解决方案可能需要更多的代码。
最简单的方法是遍历数组,并将每个值追加到一个列表中。
int[] values = { 1, 2, 3 };
List<Integer> list = new ArrayList<>();
for (int value : values) list.add(value);

虽然,如果您没有使用原始数据类型,您可以利用List#of方法,并摆脱循环
为了创建一个可变的List,我将值作为新的ArrayList参数提供。
String[] strings = { "a", "b", "c" };
List<String> list = new ArrayList<>(List.of(strings));

Integer[] numbers = { 1, 2, 3 };
List<Integer> list = new ArrayList<>(List.of(numbers));

此外,您可以通过流式处理数组来得到一个List对象。
对于原始数据类型的数组,需要稍微多一点的努力。 集合框架专为对象而构建,而不是原始数据类型。 建议使用包装类,如IntegerFloat等,来处理任何具有资源的数组对象。
您可以使用Arrays#stream方法对数组进行流式处理。
这将返回一个IntStream,然后您可以调用boxed方法,它会返回一个包装或"boxed"值的流。
最后,使用Stream#toList方法将boxed流作为List返回。

再次,为了获得可变的List,我将值作为新的ArrayList参数提供。

int[] numbers = { 1, 2, 3 };
List<Integer> list = new ArrayList<>(Arrays.stream(numbers).boxed().toList());

最后一点,如果你只想向一个 List 中添加一系列值,只需使用 List#of 方法。
只要记住这会产生一个 immutableList

Immutable:

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

可变的:

List<Integer> list = new ArrayList<>(List.of(1, 2, 3));

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