标签:判断 ret 自己 etc 种类 努力 申请 obj 返回
对于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>
第一次写博客,就先分享点自己平时记录的知识吧,可能比较基础,选择性看吧。
标签:判断 ret 自己 etc 种类 努力 申请 obj 返回
原文地址:https://www.cnblogs.com/darkfire/p/12748673.html