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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 韩慧阳 中级黑马   /  2012-5-9 17:04  /  2759 人查看  /  3 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

毕老师说它是没有限制的,不像数组那样。ArrayList()  构造一个初始容量为 10 的空列表,这是API给的。如果ArrayList a1=new ArrayList();按照意思就是说当存入的对象超过10个那么a1的容量就会自增。  但是这个类有提供了另一种构造函数ArrayList(int initialCapacity)  构造一个具有指定初始容量的空列表。既然是可以自动增长空间的,JAVA又为什么要给这个构造方法呢??   这两种方法在使用时JVM底层有不一样的地方吗?或者这两种在使用上的区别是什么啊??
我对这个初始容量的理解对吗?

评分

参与人数 1技术分 +1 收起 理由
攻城狮 + 1 赞一个!

查看全部评分

3 个回复

倒序浏览
JVM运行的时候,操作系统给它分配的资源和空间是有限的。所以,对程序的优化和完善,除了运行效率和代码可读性强,空间的利用率是很关键的。

对于楼主提出的问题:
1.第一种构造方法提供的是默认的构造方式,那一般是程序员无法确定要存入数据的长度时用到的。
2.第二种构造方法,是程序员知道了自己需要用到的数据长度,指定长度等于或者稍微大于该长度的ArrayList,使得空间资源利用率较高。

对于这一点,java集合中也提供了另外一些机制和方法以供利用。比如:
ArrayList中有提供的一个函数ensureCapacity。
在添加大量元素前,应用程序可以使用 ensureCapacity 操作来增加 ArrayList 实例的容量。
这可以减少递增式再分配的数量。也就是减少了利用不到的空间分配。
java是一种友好的编程语言,它再给我们提供便利工具的同时,也为效率做了基本的打算,而我们使用的时候就要去考虑它。

我们现在调试的还是小程序,当真正做项目的时候,利用到的空间和资源会更多,因此更实际的应该要考虑到效率问题,这就是其中一点。
希望能帮助到楼主。

评分

参与人数 1技术分 +1 收起 理由
攻城狮 + 1 赞一个!

查看全部评分

回复 使用道具 举报


每个 ArrayList 实例都有一个容量。该容量是指用来存储列表元素的数组的大小。它总是至少等于列表的大小。随着向 ArrayList 中不断添加元素,其容量也自动增长。并未指定增长策略的细节,因为这不只是添加元素会带来分摊固定时间开销那样简单。

如果你没有指定初始容量或指定的容量过小,系统就会一直自动分配,如果你指定的初始化容量刚好够用,就免去了这一步

评分

参与人数 1技术分 +1 收起 理由
攻城狮 + 1 赞一个!

查看全部评分

回复 使用道具 举报
这两个构造函数的实现,我想应该是这样的:
两构造函数底层实现了一个带参数的函数
底层函数有一个默认属性=10,
当无参数函数调用时,就用默认属性;
当有参数函数调用时,就把默认属性覆盖;
我想这两个函数区别不是很大吧
唯一的区别是当你知道集合的大体长度时可节省空间。
集合的增长是按一定比例,当你需要50个空间时,无参数的就可能曾大到了60或70
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马