首页 > 编程知识 正文

数组转arraylist,数组与arraylist的区别

时间:2023-05-03 10:03:37 阅读:147009 作者:1650

一.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 (元素数据,新容量)实现的。

在明确对象的大致数量时,最好指定初始化数组的大小。

版权声明:该文观点仅代表作者本人。处理文章:请发送邮件至 三1五14八八95#扣扣.com 举报,一经查实,本站将立刻删除。