码迷,mamicode.com
首页 > 其他好文 > 详细

第一次写博客,就先分享点自己平时记录的知识吧,可能比较基础,选择性看吧。

时间:2020-04-22 00:06:09      阅读:75      评论:0      收藏:0      [点我收藏+]

标签:判断   ret   自己   etc   种类   努力   申请   obj   返回   

对于ArrayList初始化方法源码分析得到的一些结果:

    ArrayList初始化有三种方式:
      1. 第一种直接指定初始数组大小,源码如下
        private static final Object[] EMPTY_ELEMENTDATA = {};
        transient Object[] elementData; 
        
        public ArrayList(int initialCapacity) {
                if (initialCapacity > 0) {
                    this.elementData = new Object[initialCapacity];
                } else if (initialCapacity == 0) {
                    this.elementData = EMPTY_ELEMENTDATA;
                } else {
                    throw new IllegalArgumentException("Illegal Capacity: "+
                                                       initialCapacity);
                }
         }
          分析上面截取的部分代码:由于ArrayLsit定义使用的泛型ArrayList<E>,所以可以看到申请的
        EMPTY_ELEMENTDATA数组和elementData数组都为Object类型,在具体使用时再具体指明
        具体为何种类型,其中elementData用transient修饰了,表示该成员不会被序列化,但是
        ArrayList实现了java.io.Serializable接口是可以序列化的,具体如何实现的这里

        我就不解释了,回到源代码,initialCapacity大于0的话是直接申请该大小的Object数组,
        等于0是指向一个static 和final修饰的EMPTY_ELEMENTDATA,当然如果指定的大小不符合
        实际就会抛出IllegalArgumentException。

         

      2. 第二种不指定初始容量,源码如下:

        public ArrayList() {
               this.elementData = DEFAULTCAPACITY_EMPTY_ELEMENTDATA;
        }该方式比较简单,直接指向EMPTY_ELEMENTDATA
        
      3. 第三种方式传入一个Collection集合类型的参数,源码如下:

          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调用其实现Collection的toArray()方法转换为数组类型,然后进行判断。
        elementData.lenth不等于0时判断其是否为Object类型,不是则调用Arrays.copyOf()方法复制一个
        相等大小的Object数组返回给elementData;elementData.lenth等于0则直接指向EMPTY_ELEMENTDATA。

 

  好了,第一次写就分享这些了,哪里有问题希望大家指点指点,以后也会陆续分享一些其他的东西,共同努力吧!

                                                                                             技术图片

 

 

ArrayList<E>

第一次写博客,就先分享点自己平时记录的知识吧,可能比较基础,选择性看吧。

标签:判断   ret   自己   etc   种类   努力   申请   obj   返回   

原文地址:https://www.cnblogs.com/darkfire/p/12748673.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!