9_1 ArrayList 初始化 (elementData.getClass() != Object[].class)

  1. 第一个知识点, 数组也有自己.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

     

  2. 所以 String[].getClass() 和 Object[].class 是不一样的。   

  3. 第二个知识点: 子类重写父类方法的时候,在不修改返回值类型的前提下,子类返回了什么类型,具体得到的是子类的返回值类型,而不会上转成父类的返回值类型

    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
    

     

  4. 来到重点,下边代码中   (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;
            }
        }

     

  5. 首先   c.toArray(); 功能是将集合中的元素转换成数组,它在Collection中是这样子的,是接口中的方法,那么它就要被重写

    Object[] toArray();

     

  6. 先给出结论:实现 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);
        }
    }
    

     

  • 8
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值