这个问题在这里已有答案:
起源
答案:
正如@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的列表
集合只能包含非基本类型的对象。
java.util.Arrays.asList(T ... a)这里T可以是一个非原始的对象。
而在这种情况下 Arrays.asList(炭[]),它会考虑 炭[] 作为对象(T)。因此,您将在下面的打印中看到意外的字符:
的System.out.println(Arrays.asList(chars2));
输出:
[[C @ 15db9742]
并且对于原始类型数组,大小总是一个。
之所以如此,是因为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个数组对象。
希望这说清楚。
因为chars2是一个对象,但'a'和'b'是字符,而char是基本类型,而不是对象类型。因此,chars2用作结果列表中的第一个(也是唯一的)元素。