本文的研究主要是关于详细解决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扩容问题实例详解的全部内容,希望对大家有所帮助。感兴趣的朋友可以继续参阅本站其他相关专题,如有不足之处,欢迎留言指出。感谢朋友们对本站的支持!
希望与广大网友互动??
点此进行留言吧!