第一次写博客,就先分享点自己平时记录的知识吧,可能比较基础,选择性看吧。
Posted darkfire
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了第一次写博客,就先分享点自己平时记录的知识吧,可能比较基础,选择性看吧。相关的知识,希望对你有一定的参考价值。
对于ArrayList初始化方法源码分析得到的一些结果:
- ArrayList初始化有三种方式:
- 第一种直接指定初始数组大小,源码如下
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。 -
第二种不指定初始容量,源码如下:
public ArrayList() { this.elementData = DEFAULTCAPACITY_EMPTY_ELEMENTDATA; }该方式比较简单,直接指向EMPTY_ELEMENTDATA
-
第三种方式传入一个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>
以上是关于第一次写博客,就先分享点自己平时记录的知识吧,可能比较基础,选择性看吧。的主要内容,如果未能解决你的问题,请参考以下文章