黑马程序员技术交流社区

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

作者: 陈山    时间: 2012-11-24 18:54
标题: ArrayList的疑问
本帖最后由 陈山 于 2012-11-25 21:10 编辑

大家都知道ArrayList的底层数据结构是数组的,数组的长度是不可改变的,但是ArrayList的大小却是可以改变的,为什么会这样呢?
作者: 郑丹丹    时间: 2012-11-24 19:04
ArrayList底层的数据结构使用的是数组结构。它默认长度是10,但可以50%延长。
作者: 赵红萍    时间: 2012-11-24 19:05
楼主说的没错,ArrayList的底层是数组结构的,并且分配好的长度是不能改变的,并且ArrayList默认的情况下,系统分配的长度是10,当超过这个长度时,系统会重新分配一个新的ArrayList,长度是15,ArrayList是按照50%增加的,它会把数组中以前的元素拷贝到新数组中,再把新元素添加近来,这些操作是由jvm来完成,不用自己写程序实现的.
作者: 刘子义    时间: 2012-11-24 19:05
ArrayList的大小改变时,底层也会根据这个大小值判断是否再创建一个新的足够长的数组存放数据
作者: ljhheima    时间: 2012-11-24 20:17
新建的ArrayList会分配一定的内存,当元素多到不能再增加元素时,再分配更多的空间。
当你的ArrayList对象需要的空间比较大时,可以使用ensureCapacity获取分配空间,提高效率。这样可以大大提高初始化速度。
作者: 森仔    时间: 2012-11-24 21:24
rrayList在没有大小指定的构造方法下,它们的空间默认个数是10个,那么放入第11个元素时,ArrayList会增加原来空间的一半,之后若空间还不够就按50%的递增了
作者: 齐银春    时间: 2012-11-24 22:45
底层数据结构还是数组的,如果超出默认的空间会按照其空间的一半进行递增
作者: yzqiong5566    时间: 2012-11-24 23:57
本帖最后由 yzqiong5566 于 2012-11-24 23:59 编辑

        ArrayList的列表对象实质上是存储在一个引用型数组里的,有人认为该数组有“自动增长机制”可以自动改变size大小。正式地说,该数组是无法改变大小的,实际上它只是改变了该引用型数组的指向而已。
        ArrayList底层采用Object类型的数组实现,当使用不带参数的构造方法生成ArrayList对象时,实际上会在底层生成一个长度为10的Object类型数组。在用户向ArrayList追加对象时,Java总是要先计算容量(Capacity)是否适当,若容量不足则把原数组拷贝到以指定容量为长度创建的新数组内,并对原数组变量重新赋值,指向新数组。在这同时,size进行自增1。在删除对象时,先使用拷贝方法把指定index后面的对象前移1位(如果有的话),然后把空出来的位置置null,交给Junk收集器销毁,size自减1,即完成了。
作者: jerry2627    时间: 2012-11-25 00:15
底层结构是动态数组





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