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

我使用了Arrays.asList(),但行为(和签名)不知怎么地从Java SE 1.4.2(文档现在存档)改变到8,我在web上找到的大多数代码片段都使用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);

当前回答

如果您正在尝试优化内存等(并且不想引入外部库),那么实现您自己的不可变“数组视图列表”比您想象的要简单——您只需要扩展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];
    }
}

其他回答

在Java 9中,您可以通过新的方便的工厂方法List.of使用更优雅的不可变列表:

List<String> immutableList = List.of("one","two","three");

(无耻地从这里抄袭)

从Java 8开始,应该执行以下操作

int[] temp = {1, 2, 3, 4, 5};
List<Integer> tempList = Arrays.stream(temp).boxed().collect(Collectors.toList());

说到转换方式,这取决于你为什么需要你的列表。 如果你只需要读取数据。好的,给你:

Integer[] values = { 1, 3, 7 };
List<Integer> list = Arrays.asList(values);

但如果你这样做:

list.add(1);

你会得到java.lang.UnsupportedOperationException。 所以在某些情况下你甚至需要这个:

Integer[] values = { 1, 3, 7 };
List<Integer> list = new ArrayList<Integer>(Arrays.asList(values));

第一种方法实际上不转换数组,但“表示”它像一个列表。但是数组的所有属性都在底层,比如固定数量的元素。请注意,在构造ArrayList时需要指定类型。

给定的数组:

    int[] givenArray = {2,2,3,3,4,5};

将整数数组转换为整数列表

一种方法:boxxed() ->返回IntStream

    List<Integer> givenIntArray1 = Arrays.stream(givenArray)
                                  .boxed()
                                  .collect(Collectors.toList());

第二种方法:将流的每个元素映射为Integer,然后收集

注意: 使用mapToObj你可以隐蔽每个int元素到字符串流,字符流等套管i (char)i

    List<Integer> givenIntArray2 = Arrays.stream(givenArray)
                                         .mapToObj(i->i)
                                         .collect(Collectors.toList());

将一个数组类型转换为另一个类型示例:

List<Character> givenIntArray2 = Arrays.stream(givenArray)
                                             .mapToObj(i->(char)i)
                                             .collect(Collectors.toList());

你能不能改进这个答案,因为这是我使用的,但我不是100%清楚。它工作正常,但intelliJ增加了新的气象站[0]。为什么是0 ?

公共气象站[]removeElementAtIndex(气象站[]数组,int索引) { List<WeatherStation> List = new ArrayList<WeatherStation>(Arrays.asList(array)); list.remove(指数); 返回列表。toArray(新WeatherStation [0]); }