A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© bushangkoukou 中级黑马   /  2013-6-9 16:01  /  1986 人查看  /  10 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 bushangkoukou 于 2013-6-9 17:08 编辑

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

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

评分

参与人数 1技术分 +1 收起 理由
黑马伍哲沂 + 1 赞一个!

查看全部评分

10 个回复

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

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

感谢..........................................
回复 使用道具 举报
看源代码你就很清楚了。
public ArrayList() {
        this(10);
    }
ArrayList里面是用了一个泛型的数组来保存元素的。
这是初始化的时候的代码,这里你很容易就知道了初始化的容量为什么是10,至于说为什么超过了10个继续添加的时候不会报错,是因为在添加的时候add方法中做了容量判断,如果是超过了已有的容量,它就会新建一个数组,这个数组的长度是原来的1.5倍+1,比如初始化的时候为10,第一次增长之后的长度为16,然后将原来的数据copy到新的数组中,再继续添加新的元素。具体的代码太复杂,不好粘贴出来,你可以去ArrayList类中查看相关的代码
回复 使用道具 举报
花心々小土豆 发表于 2013-6-9 16:35
数组是保存一组对象最有效的方式,但是数组有固定的长度,当我们不知道要操作的对象具体有多少个时,Java给 ...

不懂不要乱说,你去看看源代码是按照什么方式增长的,  int newCapacity = (oldCapacity * 3)/2 + 1;

评分

参与人数 1技术分 +1 收起 理由
尹丽峰 + 1 赞一个!

查看全部评分

回复 使用道具 举报
好吧。其实大家说的差不多了。  ArrayList底层数据结构就是数组。 默认初始化大小为10,
也可以通过另外一个构造函数来指定初始化大小为其它大小。
如果是默认初始化,当装满10个了,就按一定比例重新创建一个新的数组,然后将原来数组里的数据复制到新的数组里面。
并将原来数组的引用指向新的数组。

评分

参与人数 1技术分 +1 收起 理由
尹丽峰 + 1 老伍威武!

查看全部评分

回复 使用道具 举报
本帖最后由 尹丽峰 于 2013-6-9 17:54 编辑

这个默认容量10,不够的时候会自动创建新的容量,把原来的元素都复制到这个新的集合中,具体新的集合容量是多少?LinklList是50%增长,Vector则是100% ArrayList 的确是是以前(1/2)+1

评分

参与人数 1技术分 +1 收起 理由
袁梦希 + 1 客狗威武

查看全部评分

回复 使用道具 举报
武志红 发表于 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 17:43
这个默认容量10,不够的时候会自动创建新的容量,把原来的元素都复制到这个新的集合中,具体新的集合容量是 ...

哥们!给分的时候多用点心,好好看看,也许我没错呢。版本不同而已!
我真想不通你在给他加分的时候理由写“赞一个”是什么心情!!
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马