- 第一个知识点, 数组也有自己.class [ 表示维度, Lxxx表示数组的元素类型
package 集合类.ArrayList类; import java.util.ArrayList; import java.util.Arrays; public class Test { public static void main(String[] args) { String [] a = new String[2]; Object [] b = new Object[2]; System.out.println(a.getClass()); System.out.println(b.getClass()); System.out.println(String.class); ArrayList<String> aa = new ArrayList<>(); aa.add("a"); aa.add("b"); } }
输出是
class [Ljava.lang.String; class [Ljava.lang.Object; class java.lang.String
-
所以 String[].getClass() 和 Object[].class 是不一样的。 各
-
第二个知识点: 子类重写父类方法的时候,在不修改返回值类型的前提下,子类返回了什么类型,具体得到的是子类的返回值类型,而不会上转成父类的返回值类型
package 数组拷贝方法; import java.util.ArrayList; class AF{ public Object test(){ return new Object(); } } class BF extends AF{ @Override public Object test() { return 1; } } public class AAAAAAA { public static void main(String[] args) { System.out.println(new BF().test().getClass()); } }
这里的输出是
class java.lang.Integer
-
来到重点,下边代码中 (elementData.getClass() != Object[].class) 判断了什么? 有什么用?
public ArrayList(Collection<? extends E> c) { elementData = c.toArray(); if ((size = elementData.length) != 0) { // c.toArray might (incorrectly) not return Object[] (see 6260652) if (elementData.getClass() != Object[].class) elementData = Arrays.copyOf(elementData, size, Object[].class); } else { // replace with empty array. this.elementData = EMPTY_ELEMENTDATA; } }
-
首先 c.toArray(); 功能是将集合中的元素转换成数组,它在Collection中是这样子的,是接口中的方法,那么它就要被重写
Object[] toArray();
-
先给出结论:实现 Collection接口的类可萌会重写toArray();方法,根据2, 可以知道有可能返回的就不是Object 数组了,再根据 1, 就可以知道
(elementData.getClass() != Object[].class) 是有可能成立的。 具体看下边的例子package 集合类.ArrayList类; import java.util.ArrayList; import java.util.Arrays; import java.util.List; public class Test { public static void main(String[] args) { new ArrayList<String>(Arrays.asList("a","b","s")); // Arrays 中有一个 "类似" ArrayList 的List ,这个List 的toArray 返回的是一个泛型数组,那么,不等条件就成立了 !!!!!!!!!!! new ArrayList<Object>(Arrays.asList(new Object(),new Object())); // 当这个泛型是Object 的时候,就和"真正"的 ArraysList 有点像了 //这里就是一个”真正“ 的ArrayList 了,它的toArray 是返回了Object[] 的 List<String> a = new ArrayList<>(16); a.add("a"); a.add("b"); new ArrayList<String>(a); } }
9_1 ArrayList 初始化 (elementData.getClass() != Object[].class)
最新推荐文章于 2024-01-29 18:04:25 发布