我有以下简单的测试用例
@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 []。
答案 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用作结果列表中的第一个(也是唯一的)元素。