有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java数组。asList()没有正常工作?

我有一个float[],我想得到一个包含相同元素的列表。我可以一个接一个地添加它们,但我想使用数组。asList方法。但有一个问题。这是有效的:

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

但事实并非如此

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

asList方法接受varargs参数,据我所知,它是数组的“简写”

问题:

  • 为什么第二段代码返回List<int[]>而不是List<int>

  • 有办法纠正吗

  • 为什么自动装箱在这里不起作用;i、 e.int[]Integer[]


共 (3) 个答案

  1. # 1 楼答案

    Why doesn't autoboxing work here; i.e. int[] to Integer[]?

    虽然自动装箱会将int转换为Integer,但不会将int[]转换为Integer[]

    为什么不呢

    答案很简单(但并不令人满意),因为JLS就是这么说的。(如果您愿意,可以查看。)

    真正的答案对于自动装箱的作用以及为什么它是安全的至关重要

    当在代码中的任何地方自动装箱1时,都会得到相同的Integer对象。并非所有int值都是如此(由于Integer自动装箱缓存的大小有限),但如果使用equals来比较Integer对象,您会得到“正确”的答案

    基本上N == N总是正确的,而new Integer(N).equals(new Integer(N))总是正确的。此外,这两件事仍然是正确的。。。假设您坚持使用纯Java代码

    现在考虑一下:

    int[] x = new int[]{1};
    int[] y = new int[]{1};
    

    这些是平等的吗?不x == y是假的x.equals(y)是假的!但为什么呢?因为:

    y[0] = 2;
    

    换句话说,具有相同类型、大小和内容的两个数组总是可以区分的,因为Java数组是可变的

    自动装箱的“承诺”是这样做是可以的,因为结果无法区分1。但是,由于数组的equals定义和数组的可变性,所有数组基本上都是可区分的。因此,如果允许对基元类型的数组进行自动装箱,这将破坏“承诺”


    1-。。。。。前提是不使用==测试自动装箱的值是否相等

  2. # 2 楼答案

    这个怎么样

    Integer[] ints = new Integer[] {1,2,3,4,5};
    List<Integer> list = Arrays.asList(ints);
    
  3. # 3 楼答案

    输入Java 8,您可以执行以下操作以在盒式数组中进行收集:

    Integer[] boxedInts = IntStream.of(ints).boxed().toArray(Integer[]::new);
    

    或者把这个放进盒装清单里

    List<Integer> boxedInts = IntStream.of(ints).boxed().collect(Collectors.toList());
    

    然而,这只适用于int[]long[]double[]。这对byte[]不起作用

    注意Arrays.stream(ints)IntStream.of(ints)是等价的。所以前面的两个例子也可以改写为:

    Integer[] boxedIntArray = Arrays.stream(ints).boxed().toArray(Integer[]::new);
    List<Integer> boxedIntList = Arrays.stream(ints).boxed().collect(Collectors.toList());
    

    最后一种形式可能更受欢迎,因为它省略了Stream的原始特定亚型。然而,在内部,它仍然是一堆重载的,在本例中,这些重载仍然在内部创建一个IntStream