首页 > 编程知识 正文

数组的扩容有几种方式,java二维arraylist

时间:2023-05-04 04:09:08 阅读:147003 作者:3545

本文的研究主要是关于详细解决java arraylist扩展问题实例的内容,具体介绍如下。

首先,需要知道arraylist的内容其实是object型的数组,arraylist的扩展问题其实是这个object型的数组的扩展问题。

传输对象[ ] element data;

一、创建时arraylist的容量分配

创建arraylist有三种情况

1、创建默认大小(默认值为0 ) )。

arraylist al=new arraylist (;

创建完成后,al的容量为0。 从下面的代码可以看出。

传输对象[ ] element data;

privatestaticfinalobject [ ] default capacity _ empty _ element data={ };

公共阵列() {

this.element数据=default capacity _ empty _ element data;

}

2、指定大小制作

Arraylistal=newArraylist(5;

创建容量为5的arraylist对象时,实际上是长度为5的object数组。 从以下代码中可以看到。

传输对象[ ] element data;

privatestaticfinalobject [ ] default capacity _ empty _ element data={ };

公共阵列(intinitialcapacity ) {

if(initialcapacity0) {

this.element data=new object [ initial capacity ];

(else if (初始容量==0) ) )。

this.element数据=empty _ element数据;

} else {

thrownewillegalargumentexception (英特尔容量: )。

初始容量;

}

}

3、指定创建要素集合

ArrayList al=new ArrayList (arrays.as list (1,2,3,4,5 );

在上创建arraylist对象,并使用[1、2、3、4、5]初始化一个list。 实际上,我们做了一个长5的object序列。 数组的内容为[ 1,2,3,4,5 ]。 从下面的代码可以看出。

私密int size;

传输对象[ ] element data;

privatestaticfinalobject [ ] default capacity _ empty _ element data={ };

公共阵列(collectionextendsec ) {

elementdata=c.toarray (;

if((size=elementdata.length )!=0}{

//c.toArraymight(incorrectly ) notreturnobject[](see6260652 ) ) ) ) ) ) ) ) )。

if(elementdata.getclass (!=object[].class )

element data=arrays.copy of (element data,size,object[].class );

} else {

//replace with empty阵列。

this.element数据=empty _ element数据;

}

}

二、插入元素时,阵列列表容量扩展

ArrayList collection=new ArrayList (arrays.as list (1,2,3,4,5 ) );

integer [ ] more ints={ 6,7,8,9,10 };

collection.addall (arrays.as list ) moreints );

上述步骤如下。

1、创建size为5的阵列列表。 内容是[ 1,2,3,4,5 ]。 ——初始容量为5

2、将集合{6、7、8、9、10}添加到此arraylist对象。 ——-此时,需要扩展此arraylist对象的容量。

查看源代码:

publicbooleanaddall(collectio

n extends e> c) {

// 得到插入数组

object[] a = c.toarray();

// 得到插入内容长度

int numnew = a.length;

ensurecapacityinternal(size + numnew);

// increments modcount

system.arraycopy(a, 0, elementdata, size, numnew);

size += numnew;

return numnew != 0;

}

private void ensurecapacityinternal(int mincapacity) {

//如果arraylist里面的内容为空

if (elementdata == defaultcapacity_empty_elementdata) {

mincapacity = math.max(default_capacity, mincapacity);

}

ensureexplicitcapacity(mincapacity);

}

private void ensureexplicitcapacity(int mincapacity) {

modcount++;

// 进一步计算扩充后的大小mincapacity

if (mincapacity - elementdata.length > 0)

grow(mincapacity);

}

private void grow(int mincapacity) {

// arraylist的原始大小

int oldcapacity = elementdata.length;

// 在原始大小的基础上计算扩充后的大小,扩充后的大小是元素大小的1.5倍

int newcapacity = oldcapacity + (oldcapacity >> 1);

//跟前面计算的扩充后长度mincapacity比较,取较大的那个为扩充后长度

if (newcapacity - mincapacity < 0)

newcapacity = mincapacity;

// 如果扩充后长度大于最大长度

if (newcapacity - max_array_size > 0)

newcapacity = hugecapacity(mincapacity);

// 扩充

elementdata = arrays.copyof(elementdata, newcapacity);

}

private static int hugecapacity(int mincapacity) {

// mincapacity小于0,说明溢出,否则将最大整数作为最终扩充长度

if (mincapacity < 0) // overflow

throw new outofmemoryerror();

return (mincapacity > max_array_size) ?

integer.max_value :

max_array_size;

}

上面的过程可以这样总结:

1、arraylist的原始大小size + 将要插入集合的大小numnew = 得到扩充后arraylist的最小长度mincapacity

2、如果arraylist的原始大小size为0,即arraylist为空,arraylist扩充后的最小长度mincapacity= math.max(10, mincapacity),也就是说扩充后的最小长度mincapacity,并不仅仅是原始长度size加上插入集合的长度numnew。

3、上面得到的扩充后最小长度mincapacity,并不是最终扩充后的长度,还需要进一步进行计算。

(1)得到arraylist的原始大小oldcapacity

(2)得到新的扩充后的大小:newcapacity = oldcapacity*1.5;

(3)将上面计算的扩充后的最小长度mincapacity与这里得到的扩充后的大小newcapacity进行比较,取较大的那个最为最终扩充后的大小。

总结

以上就是本文关于arraylist扩容问题实例详解的全部内容,希望对大家有所帮助。感兴趣的朋友可以继续参阅本站其他相关专题,如有不足之处,欢迎留言指出。感谢朋友们对本站的支持!

希望与广大网友互动??

点此进行留言吧!

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