黑马程序员技术交流社区

标题: 关于ArrayList的问题 [打印本页]

作者: bushangkoukou    时间: 2013-6-9 16:01
标题: 关于ArrayList的问题
本帖最后由 bushangkoukou 于 2013-6-9 17:08 编辑

刚才查APi     
APi中的原话:
           ArrayList()
          构造一个初始容量为 10 的空列表。

此话怎么理解?是不是ArrayList()   的容量是10?但是我刚才我刚才add了不止10个元素,还是没有报错 啊?
求解释啊

作者: 萌小子    时间: 2013-6-9 16:16
构造的是一个初始容量为 10 的空列表。
记住是初始容量,集合与数组的最大区别就是数组的大小是在穿建的时候就设定了的,不能改变了。而集合有一个初始容量,当集合装满时它还会自动增加预先设置好的容量。这也就是为什么你add了多于10个元素而不报错的原因。
作者: Renica    时间: 2013-6-9 16:24
一楼已经很清楚了,过来抢个位置。当超过容量时ArryList()会自动增加,这是与数组的不同。
作者: 花心々小土豆    时间: 2013-6-9 16:35
本帖最后由 花心々小土豆 于 2013-6-9 20:06 编辑

数组是保存一组对象最有效的方式,但是数组有固定的长度,当我们不知道要操作的对象具体有多少个时,Java给我给了集合来解决这事。
ArrayList初始长度是10,如果要存入的对象超出这个范围 则长度以百分之五十递增,即变成15……。
其实具体原理就是:新开辟另一个长度为15的数组把初始的对象和超出的装入。
还有一个Vector,它是按百分之百递增的,过时了!!
作者: bushangkoukou    时间: 2013-6-9 17:07
王盟盟 发表于 2013-6-9 16:16
构造的是一个初始容量为 10 的空列表。
记住是初始容量,集合与数组的最大区别就是数组的大小是在穿建的时 ...

感谢..........................................
作者: 武志红    时间: 2013-6-9 17:19
看源代码你就很清楚了。
public ArrayList() {
        this(10);
    }
ArrayList里面是用了一个泛型的数组来保存元素的。
这是初始化的时候的代码,这里你很容易就知道了初始化的容量为什么是10,至于说为什么超过了10个继续添加的时候不会报错,是因为在添加的时候add方法中做了容量判断,如果是超过了已有的容量,它就会新建一个数组,这个数组的长度是原来的1.5倍+1,比如初始化的时候为10,第一次增长之后的长度为16,然后将原来的数据copy到新的数组中,再继续添加新的元素。具体的代码太复杂,不好粘贴出来,你可以去ArrayList类中查看相关的代码

作者: 武志红    时间: 2013-6-9 17:26
花心々小土豆 发表于 2013-6-9 16:35
数组是保存一组对象最有效的方式,但是数组有固定的长度,当我们不知道要操作的对象具体有多少个时,Java给 ...

不懂不要乱说,你去看看源代码是按照什么方式增长的,  int newCapacity = (oldCapacity * 3)/2 + 1;
作者: 黑马伍哲沂    时间: 2013-6-9 17:31
好吧。其实大家说的差不多了。  ArrayList底层数据结构就是数组。 默认初始化大小为10,
也可以通过另外一个构造函数来指定初始化大小为其它大小。
如果是默认初始化,当装满10个了,就按一定比例重新创建一个新的数组,然后将原来数组里的数据复制到新的数组里面。
并将原来数组的引用指向新的数组。

作者: 尹丽峰    时间: 2013-6-9 17:43
本帖最后由 尹丽峰 于 2013-6-9 17:54 编辑

这个默认容量10,不够的时候会自动创建新的容量,把原来的元素都复制到这个新的集合中,具体新的集合容量是多少?LinklList是50%增长,Vector则是100% ArrayList 的确是是以前(1/2)+1
作者: 花心々小土豆    时间: 2013-6-9 19:11
武志红 发表于 2013-6-9 17:26
不懂不要乱说,你去看看源代码是按照什么方式增长的,  int newCapacity = (oldCapacity * 3)/2 + 1; ...

这个!!能不能不要这么说话,就算我说的有问题咱们可以讨论啊……
我用的是jdk1.7.0,源码里和你对应的那句是这样写的:int newCapacity = oldCapacity + (oldCapacity >> 1);
我也在网上下了一个旧版的jdk源码,里面描述的和你写的一样,估计你需要换下版本了!!
还有,毕老师视频里讲过的,我刚特意从新找到听了下,第14天06,10分40秒之后的几句话!
以后互相学习,能看的出你学习能力很强,希望能和你多交流……………………
作者: 花心々小土豆    时间: 2013-6-9 19:30
尹丽峰 发表于 2013-6-9 17:43
这个默认容量10,不够的时候会自动创建新的容量,把原来的元素都复制到这个新的集合中,具体新的集合容量是 ...

哥们!给分的时候多用点心,好好看看,也许我没错呢。版本不同而已!
我真想不通你在给他加分的时候理由写“赞一个”是什么心情!!




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2