问题 Arrays.asList的原始类型和包装类型[重复]


这个问题在这里已有答案:


13023
2017-11-07 08:29


起源

因为泛型仅适用于引用类型。 - Andy Turner
这将成为java陷阱的一个很好的例子 - texasbruce


答案:


正如@Andy所解释的那样,泛型只能使用引用类型。这意味着 List<char> 是不允许的(所以 Arrays.asList 不能回来 List<char>)。代替 Arrays.asList 将其输入解释为单个对象,并返回包含该单个元素的列表。

    Character[] chars1 = new Character[]{'a', 'b'};
    List<Character> list1 = Arrays.asList(chars1);

    char[] chars2 = new char[]{'a', 'b'};
    List<char[]> list2 = Arrays.asList(chars2);

比较 Arrays.asList(chars2) 有了这个 String 示例(其中输入也是单个元素):

    String test = "test";
    List<String> asList = Arrays.asList(test);

返回size()== 1的列表


6
2017-11-07 08:52



明白了......从Generic的角度来看,不理解它, - Tom


集合只能包含非基本类型的对象。

java.util.Arrays.asList(T ... a)这里T可以是一个非原始的对象。

而在这种情况下 Arrays.asList(炭[]),它会考虑 炭[] 作为对象(T)。因此,您将在下面的打印中看到意外的字符:

的System.out.println(Arrays.asList(chars2));

输出:

[[C @ 15db9742]

并且对于原始类型数组,大小总是一个。


3
2017-11-07 08:49





之所以如此,是因为List只接受Objects而不是基元。因此,当您传递一个对象数组时,它会获取这些对象并创建它的列表。但是当你传递一个基元数组时,它会获取数组本身(它是一个Object)并创建List。 在第一种情况下,有2个对象,因此列表的长度为2.而在第二种情况下,只有一个对象(即数组本身),所以现在长度为1。

以下代码将清楚说明

import java.util.Arrays;

public class Test {

    public static void main(String[] args) {
        Test test = new Test();
        test.testArraysAsList();
    }
    public void testArraysAsList() {
        Character[] chars1 = new Character[]{'a', 'b'};
        System.out.println(Arrays.asList(chars1).size());


        char[] chars2 = new char[]{'a', 'b'};
        System.out.println(Arrays.asList(chars2).size());

        Integer[] int1 = new Integer[]{1, 2};
        System.out.println(Arrays.asList(int1));

        int[][] int2 = new int[][]{{1,2},{1,2} };
        System.out.println(Arrays.asList(int2));


    }
}

现在看看通过在我的机器上运行上面的代码获得的输出。

2
1
[1, 2]
[[I@1540e19d, [I@677327b6]

自从 int2 数组是二维数组,它有2个数组。所以它有2个对象。所以在这种情况下长度为2。你可以在输出中看到它 [[I@1540e19d 和 [I@677327b6] 这次是2个数组对象。

希望这说清楚。


2
2017-11-07 08:56





因为chars2是一个对象,但'a'和'b'是字符,而char是基本类型,而不是对象类型。因此,chars2用作结果列表中的第一个(也是唯一的)元素。


1
2017-11-07 08:49