Arrays.asList的原始类型和包装类型

时间:2017-11-07 08:29:56

标签: java

我有以下简单的测试用例

@Test
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());

}

结果是: 2 1

我不理解Arrays.asList(chars2),为什么Arrays.asList(char[])制作一个单一的列表,元素为char []。

4 个答案:

答案 0 :(得分:6)

正如@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

的列表

答案 1 :(得分:3)

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

  

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

Arrays.asList(char [])的情况下,它将 char [] 视为对象(T)。因此,您将在下面的打印中看到意外的字符:

  

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

输出:

  

[[C @ 15db9742]

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

答案 2 :(得分:2)

之所以如此,是因为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个数组对象。

希望这说清楚。

答案 3 :(得分:1)

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