请求高手指点迷津!!关于ensureCapacity()的使用,郁闷好几天拉!

cwn_1981 2006-12-23 10:48:40
import java.util.*;
class TestArray {
public static void main(String[] args) {
char a = '1', b = '2', c = '3', d = '4';
ArrayList a1 = new ArrayList(1000);
a1.add(0,new Character(a)) ;
a1.ensureCapacity(2);
a1.add(2, new Character(b));
System.out.println(a1.size());
}
}
出现错误:
java.lang.IndexOutOfBoundsException: Index: 2, Size: 1

我的问题是:既然ArrayList是一个可变容量数组,
我就想象数组一样把放b在第三个位置!有什么办法不?
用“a1.ensureCapacity(2);”增加容量,
为什么还是不可以?对void ensureCapacity(int minCapacity)这个
方法来增加容量不理解


...全文
810 6 打赏 收藏 转发到动态 举报
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
cwn_1981 2006-12-23
  • 打赏
  • 举报
回复
自己想再问:
如果那样使用的话,它就远没有数组那么方便了啊!
数组可以把元素存储于任意指定位置,而为什么ArrayList不可以,
对ArrayList所说"容量“不理解!
Netself 2006-12-23
  • 打赏
  • 举报
回复
char a = '1', b = '2', c = '3', d = '4';
ArrayList a1 = new ArrayList(1000);
a1.add(0,new Character(a)) ;
a1.add(null);
a1.add(2, new Character(b));
System.out.println(a1.size());
Dan1980 2006-12-23
  • 打赏
  • 举报
回复
a1.add(new Character(a));
a1.add(Null)
a1.add(new Character(b));
cwn_1981 2006-12-23
  • 打赏
  • 举报
回复
自己先顶!!
我知道如果把a1.add(2, new Character(b));
改成a1.add(1, new Character(b));那是正确的
cwn_1981 2006-12-23
  • 打赏
  • 举报
回复
呵呵
非常感谢Dan1980!!
太热心了!!
解答那么详细!!
Dan1980 2006-12-23
  • 打赏
  • 举报
回复 1
建议楼主好好了解一下ArrayList的内部。

就楼主的这个程序而言,我认为至少有二点要注意:
1. 如果你不能确定ensureCapacity()方法到底是干嘛用的,最好不要随便用它。
2. 指定位置来往ArrayList中插入元素有可能引用元素的大量移动,是极其影响效率的,也不要滥用。

任何一个ArrayList对象都有一个capacity属性,用来指示该ArrayList的最小容量,用“容量”这个词容易引起像本贴楼主那样的误解,我觉得用“容纳能力”比较贴切。

我们知道ArrayList的内部是采用数组来存储元素的,由于java数组都是定长的,所以这个数组的大小一定是固定的,这个大小就是capacity。我们可以肯定capacity一定是大于或等于ArrayList的size,那么当size不断增加到了要超过capacity的时候,ArrayList就不得不重新创建新的capacity来容纳更多的元素,这时需要首先建立一个更长的数组,将原来的数组中的元素复制到新数组中,再删除原来的数组。可见当ArrayList越来越大时,这种操作的消耗也是越来越大的。

为了减少这种不必要的重建capacity的操作,当我们能肯定ArrayList大致有多大(或者至少会有多大)时,我们可以先让ArrayList把capacity设为我们期望的大小,以避免多余的数组重建。

假设ArrayList自动把capacity设为10,每次重建时将长度递增原来的三分之二,那么当我们需要大约存储50个元素到ArrayList中时,就会大约需要重建数组4次,分别是在增加第11、第17、第26、第39个元素的时候进行的。如果我们一开始就让ArrayList的capacity为50,那么不需要任何数组重建就能完成所有插入操作了。

java允许我们在构造ArrayList的同时指定capacity,如new ArrayList(50),也允许在以后将它设得更大,而增大capacity就是使用ensureCapacity()方法。注意:capacity只能比原来的更大,而不能比原来的更小,否则java会忽略该操作。ArrayList的初始默认capacity为10,所以给capacity指定小于10的整数是毫无意义的。

最后说说ArrayList的size,前面说过,size一定小于等于capactiy,而且更重要的是,访问超过size的位置将抛出异常,尽管这个位置可能没有超过capacity。ensureCapacity()只可能增加capacity,而不会对size有任何影响。要增加size,只能用add()方法。

62,614

社区成员

发帖
与我相关
我的任务
社区描述
Java 2 Standard Edition
社区管理员
  • Java SE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧