现象:
可运行下边代码:
public static void main(String[] args) {
List<String> asList = Arrays.asList("asList", "aa");
Object[] asListArray = asList.toArray();
System.out.println(asListArray.getClass());
ArrayList<String> lists = new ArrayList<>();
strings.add("sss");
Object[] objects1 = lists.toArray();
System.out.println(objects1.getClass());
}
运行结果:
class [Ljava.lang.String;
class [Ljava.lang.Object;
我们能发现通过两个集合转成数组后,再getClass()得到的结果是不一样的。
原因:
asList集合是通过Arrays类中的asList()方法产生的,看asList()方法:
因为泛型的原因,asList()的入参是什么类型,返回的集合内就是什么类型,例如:
List<Integer> integers = Arrays.asList(1, 4);
List<Character> d = Arrays.asList('d');
看toArray(),asList.toArray(),这个toArray()方法是Arrays类中的,在Arrays类中有一个继承了AbstractList的内部类ArrayList:
所以toArray()返回的数组中仍然是asList()的入参类型。
然后我们看lists集合,是通过new ArrayList<>()产生的,看ArrayList类中的构造函数:
这里返回的就是一个Object[],toArray()方法是ArrayList类中的,传递的类型是统一的,所以都是Object。
所以这种不同途径拿到的集合,getClass()是可能不同的。