锁定老帖子 主题:关于ArrayList的有参数构造的疑问
该帖已经被评为隐藏帖
|
|
---|---|
作者 | 正文 |
发表时间:2011-11-14
List<String> l = new ArrayList<String>(2); l.add("444"); l.add("aaa"); l.add("xxxx"); for (String s : l) { System.out.println(s); } 输出结果: 444 aaa xxxx 疑问:为什么会打出"xxxx"呢?来看下源码 /** * Constructs an empty list with the specified initial capacity. * * @param initialCapacity the initial capacity of the list. * @exception IllegalArgumentException if the specified initial capacity * is negative */ public ArrayList(int initialCapacity) { super(); if (initialCapacity < 0) throw new IllegalArgumentException("Illegal Capacity: "+ initialCapacity); //这里已经初始化了容器量 this.elementData = (E[])new Object[initialCapacity]; } 再看add方法: /** * Appends the specified element to the end of this list. * * @param o element to be appended to this list. * @return <tt>true</tt> (as per the general contract of Collection.add). */ public boolean add(E o) { ensureCapacity(size + 1); // Increments modCount!! //上面测试时参数设为2,这里如果再加应该会越界啊,但是最后缺还add进去了,疑问!!! elementData[size++] = o; return true; } 下面是测试数组的: String[] strArr = new String[2]; strArr[0] = "11"; strArr[1] = "22"; strArr[2] = "33"; for (String ss : strArr) { System.out.println(ss); } 会报异常 声明:ITeye文章版权属于作者,受法律保护。没有作者书面许可不得转载。
推荐链接
|
|
返回顶楼 | |
发表时间:2011-11-14
悲剧,这个玩意它自增,ensureCapacity 这个方法把数组长度增加了
但是为什么我限制了容量,他还自增啊,那限制容量还起什么作用? |
|
返回顶楼 | |
发表时间:2011-11-14
ensureCapacity(size + 1); // Increments modCount!!
去这个方法里面看看! |
|
返回顶楼 | |
发表时间:2011-11-14
这个构造方法不是给你限制容量用的,而是给那些知道这个容量的人用的.毕竟自动扩容会造成空间浪费.如果调用方已经知道这个List有多少数据,那么就直接告诉它数组的大小.这样也省了扩容的时候ArrayCopy
|
|
返回顶楼 | |
发表时间:2011-11-14
我已经看过这个方法了,只是我感觉奇怪的地方是为什么我明明规定了容器大小,为什么你还要往里塞呢?如果你能往里塞,那你还弄个初始化容器的值干神马用呢?如果说效率我懂,但是为什么可以超过容器大小呢
就算你造个瓶子说规格是1L了最后却装了1L多,你不认为这个瓶子很不合格吗? liuwenbo200285 写道 ensureCapacity(size + 1); // Increments modCount!!
去这个方法里面看看! |
|
返回顶楼 | |
发表时间:2011-11-14
chenjingbo 写道 这个构造方法不是给你限制容量用的,而是给那些知道这个容量的人用的.毕竟自动扩容会造成空间浪费.如果调用方已经知道这个List有多少数据,那么就直接告诉它数组的大小.这样也省了扩容的时候ArrayCopy
有道理,可能是我理解思路有点偏离,总感觉这么设计不太合理 |
|
返回顶楼 | |
发表时间:2011-11-14
那不是限制容量,那叫initialCapacity 初始容量。它实际是数组,但有扩容功能,所以让你迷惑了。
|
|
返回顶楼 | |
发表时间:2011-11-14
ArrayList 初始化参数是给你定义一开始容器的大小,免得频繁扩大.因为ArrayList的扩容是复制的,新建另外一个数组把旧的一个个复制过来,所以如果到后期,元素又比较多的时候,扩容的消耗是异常大!
|
|
返回顶楼 | |
发表时间:2011-11-14
这个是初始化值,因为设置过小,频繁的扩容是很消耗性能的
|
|
返回顶楼 | |
发表时间:2011-11-14
这么常识的东西还能上首页。晕
|
|
返回顶楼 | |