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

Posted darkfire

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了第一次写博客,就先分享点自己平时记录的知识吧,可能比较基础,选择性看吧。相关的知识,希望对你有一定的参考价值。

对于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>

以上是关于第一次写博客,就先分享点自己平时记录的知识吧,可能比较基础,选择性看吧。的主要内容,如果未能解决你的问题,请参考以下文章

第一篇博客

你好啊,点进来认识一下吧

Lambda表达式

第一篇博客

第一次写博客

第一次写博,记录自己的技术之路