一.ArrayList:
写的项目到现在为止,基本上针对业务域查询返回大列表的是使用ArrayList保存业务数据。
定义: ArrayList是List接口可变数组的实现。 实现了所有选项列表的操作,并允许了所有元素,包括null。 除了实现List接口外,该类还提供了一种操作内部用于存储列表的数组大小的方法。
每个ArrayList实例都有容量。 此容量是用于存储列表元素的数组的大小,至少与列表数组的大小相同。 随着ArrayList添加元素,容量也会自动增加,自动增加会将原始数组中的元素复制到新数组中。 因此,根据业务场景事先判断数据量的大小。 可以在生成ArrayList时指定容量。 在添加大量元素之前,APP应用程序可以使用ensureCapacity操作来增加ArrayList实例的容量,从而减少增量重新分配的数量。
注意:我们知道ArrayList不是线程安全的。 如果有场景通过多线程访问ArrayList实例,则其中一个线程在更改ArrayList列表结构之前,必须与该操作保持线程同步。
ArrayList继承了AbstractList抽象类,并实现了List接口。 基本上使用数组保存所有元素。
AbstractList的主要作用是定义抽象对数组操作的常见主要行为,并允许具有相似功能的子类具体实现自己的逻辑。
二.初始化
公共阵列(; 的默认构造函数以默认大小初始化内部数组
公共阵列(intinitialcapacity; 以指定的大小初始化内部数组
公共阵列(collectioextendsec; 使用ICollection对象构建,并将集合的元素添加到ArrayList中
公共阵列(; 默认构造函数
//*
* sharedemptyarrayinstanceusedforemptyinstances。
*/
privatestaticfinalobject [ ] empty _ element data={ };
//*
* constructsanemptylistwithaninitialcapacityoften。
*/
公共阵列() {
super (;
this.element数据=empty _ element数据;
}
我的本地JDK1.7的默认数组长度为0,JDK1.6的初始化大小为10
)1)添加元素,确定内部容量
//*
*默认初始化容量。
*/
私密性staticfinalintdefault _ capacity=10;
/* * * appendsthespecifiedelementtotheendofthislist.* * @ paramelementtobeappendedtothislist * @返回true (asspecifiedbb bb
publicbooleanadd{
企业空间国际(size 1; //通过确保内部容量、确定当前容量的大小和(如果不足)扩展容量来确保容量的大小表示在执行添加元素之前的元素数量,而不是ArrayList的容量。 容量是元素数据数组的长度
//增量模式计数!
元素数据[ size ]=e;
返回真;
}
让我们关注一下ensurecapacityinternal(size1)如何扩展。
私有语音容量国际(int min capacity ) {
//如果实际存储数组为空数组,则最小容量为默认容量,JDK1.7为10
if (元素数据==empty _ element数据) {
mincapacity=math.max (default _ capacity,mincapacity;
}
企业应用管理(mincapacity;
}
隐私保护功能(in min capacity ) {
模具计数;
//overflow-conscious代码
//如果数组的长度elementData.length小于最小容量,则需要扩展容量
if (最大容量元素数据.长度0 ) ) )。
微容量;
}
以上,elementData是用于存储实际数据的排列,minCapacity是最小的扩展容量。
三.扩展(重点) () ) ) ) ) ) ) ) ) ) ) ) ) ) ) ) ) ) 652
//*
*增加容量,使其能够容纳最小容量参数指定的元素数以上
* @param minCapacity所需的最小容量
*/
隐私保护(int min capacity ) {
//overflow-conscious代码
intoldcapacity=element data.length;
//intnewcapacity=oldcapacityoldcapacity * 0.5或扩展到1.5倍
intnewcapacity=old capacity (old capacity 1;
新容量-最小容量(if ) )。
newCapacity=minCapacity;
//max _ array _ size 3360隐私保护atestaticfinalintmax _ array _ size=integer.max _ value-8;
//此最大值用于分配给数组。 由于某些JVM需要在数组中存储标头信息,因此太大可能会引起内存溢出。 提示请求的数组大小超过了JVM限制
if(newcapacity-max_Array_size0) )。
新容量=huge capacity (mincapacity;
//mincapacityisusuallyclosetosize,so this is a win:
//将获取的扩展复制到当前数组中
元素数据=arrays.copy of (element data,newCapacity );
}
隐私保护容量(int min capacity )。
if (最大容量0 )//overflow
throw new OutOfMemoryError (;
返回(mincapacitymax _ array _ size )?
Integer.MAX_VALUE :
MAX_ARRAY_SIZE;
}
总之,ArrayList延迟了对象数组的大小空间分配,第一次添加元素时才分配10个对象空间,添加第11个元素时为1.5倍,添加16个元素时为15*1.5=22
ArrayList的扩展是通过arrays.copy of (元素数据,新容量)实现的。
在明确对象的大致数量时,最好指定初始化数组的大小。