1.现象
String[] n = new String[]{"a", "b", "c"}; System.out.println(Arrays.asList(n));//[a, b, c]
在JDK1.5版本中函数声明Arrays.asList(T ... t),即接收的是可变参数,而n字符串数组正好作为一个元素存入集合中,但该集合却显示有3个元素?
2.原因分析
//JDK1.4 Arrays.asList(Object[] obj)
//JDK1.5 Arrays.asList(T ... t)
(1).JDK1.4 写了一段程序Arrays.asList(new String[]{"a", "b"});该功能是将数组中的每个子元素作为集合的元素存入集合中
(2).JDK1.5 该函数Arrays.asList(T ... t)采用了可变参数,以前编写的代码Arrays.asList(new String[]{"a", "b"});如果不做任何处理就在新版本的虚拟机上运行,势必会发生错误。原来的本意是把数组中的子元素分别存入集合中,但现在的结果是把该数组作为一个整体存入集合,势必导致不兼容。为保持兼容性,隐含的操作是将该数组拆分,asList(T ... t)接收的是拆封后 的多个参数,这样原来编写的代码在新版本的虚拟机上任然能够正常运行!
3.特殊情况
int[] m = new int[]{1, 2, 3}; String[] n = new String[]{"a", "b", "c"}; System.out.println(Arrays.asList(m));//[[I@2c1e6b] System.out.println(Arrays.asList(n));//[a, b, c]
为什么String[]数组会拆分,而int[]数组不做任何处理?
在JDK1.4 Arrays.asList(Object[] obj)中,String[] 是 Object[]的子类,而int[] 不是 Object[]的子类,不拆分不会对兼容性造成影响!
关于Object与数组 的关系>>