黑马程序员技术交流社区

标题: ArrayList对象的动态增加原理??? [打印本页]

作者: 侯慧杰    时间: 2012-7-8 20:20
标题: ArrayList对象的动态增加原理???
ArrayList对象是动态增加的,谁能说出其深层原理或内存分配与回收的原理是什么????
作者: 韩迎龙    时间: 2012-7-8 23:23
http://bbs.itheima.com/forum.php ... ;pre_pos=3&ext=
作者: 郑玉赛    时间: 2012-7-9 06:59
Arraylist中如果数据满了,又要往里面添加数据的时候,C#编译器会为我们创建一个新的长度更大的数组,再把原来的数据放过去,删除原来数组,另外Arraylis的容量是成倍增加的,就比如说刚开始的长度为4,然后加满了,还要再放东西,长度就会增加成8。8满了就会变成16
作者: 侯慧杰    时间: 2012-7-9 08:40
郑玉赛 发表于 2012-7-9 06:59
Arraylist中如果数据满了,又要往里面添加数据的时候,C#编译器会为我们创建一个新的长度更大的数组,再把 ...

你说的长度是字节还是下表。。。。
作者: 朱灿    时间: 2012-7-9 18:46
ArrayList 内部就是一个object类型的数组,因为数组开辟的是一段连续的内存空间,如果空间没有用完,并且也没有被GC回收,剩余的空间就浪费了
作者: 古古头    时间: 2012-7-9 19:21
本帖最后由 古古头 于 2012-7-9 19:32 编辑

默认情况下,ArrayList里封装着一个长度为4的Object数组,
当你调用它的Add方法添加数据时,内部的_count++;
当_count的值与数组的长度相等时,就重新创建一个数组,长度是先前的2倍,然后把先前的数据一个一个全部复制到新数组里,
再将新的数组的引用赋给原来的数组那个变量,这样就又有新的空间可用了;
当你删除中间的某一个元素时,其实是将在数组中此元素以后的元素往前移动一位,然后_count--;
ArrayList本质上就是被动态维护着的数组。
作者: 李志群    时间: 2012-7-9 20:00
collection
  List:元素是有序的,元素可以重复,因为该集合体系有索引。
      ArrayList:底层的数据结构使用的是数组结构。 特点:查询速度很快,但是增删稍慢。线程不同步,
      LinkedList:底层使用的是链表数据结构。特点:增删的速度很快,查询稍慢。
      Vector:底层是数组数据结构。线程同步。被ArrayList替代了。枚举就是Vector特有的取出方式。
              发现枚举和迭代器很像。其实枚举和迭代是一样的,因为枚举的名称以及方法的名称都
              过长,所以被迭代器取代了。枚举郁郁而终了。
作者: 常静华    时间: 2012-7-9 20:29
无非是两种算法:

固定式:申请一块存储器。连续存储元素,如果满了,就重新申请一块更大的空间,再拷贝进去。这种数据结构的读性能很高,写性能受影响。

链表式:用链表来存储元素。当需要增加一个元素的时候,就为新元素申请空间,并且将新元素链接到链表里面。这种数据结构容易修改、删除、添加元素。但是随机访问性能差。

ArrayList 使用的是前面的算法。




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