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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 侯慧杰 中级黑马   /  2012-7-8 20:20  /  2564 人查看  /  7 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

ArrayList对象是动态增加的,谁能说出其深层原理或内存分配与回收的原理是什么????

评分

参与人数 1技术分 +1 收起 理由
宋天琪 + 1

查看全部评分

7 个回复

倒序浏览
回复 使用道具 举报
Arraylist中如果数据满了,又要往里面添加数据的时候,C#编译器会为我们创建一个新的长度更大的数组,再把原来的数据放过去,删除原来数组,另外Arraylis的容量是成倍增加的,就比如说刚开始的长度为4,然后加满了,还要再放东西,长度就会增加成8。8满了就会变成16

评分

参与人数 1技术分 +1 收起 理由
宋天琪 + 1

查看全部评分

回复 使用道具 举报
郑玉赛 发表于 2012-7-9 06:59
Arraylist中如果数据满了,又要往里面添加数据的时候,C#编译器会为我们创建一个新的长度更大的数组,再把 ...

你说的长度是字节还是下表。。。。
回复 使用道具 举报
ArrayList 内部就是一个object类型的数组,因为数组开辟的是一段连续的内存空间,如果空间没有用完,并且也没有被GC回收,剩余的空间就浪费了

评分

参与人数 1技术分 +1 收起 理由
宋天琪 + 1

查看全部评分

回复 使用道具 举报
本帖最后由 古古头 于 2012-7-9 19:32 编辑

默认情况下,ArrayList里封装着一个长度为4的Object数组,
当你调用它的Add方法添加数据时,内部的_count++;
当_count的值与数组的长度相等时,就重新创建一个数组,长度是先前的2倍,然后把先前的数据一个一个全部复制到新数组里,
再将新的数组的引用赋给原来的数组那个变量,这样就又有新的空间可用了;
当你删除中间的某一个元素时,其实是将在数组中此元素以后的元素往前移动一位,然后_count--;
ArrayList本质上就是被动态维护着的数组。

评分

参与人数 1技术分 +2 收起 理由
宋天琪 + 2

查看全部评分

回复 使用道具 举报
collection
  List:元素是有序的,元素可以重复,因为该集合体系有索引。
      ArrayList:底层的数据结构使用的是数组结构。 特点:查询速度很快,但是增删稍慢。线程不同步,
      LinkedList:底层使用的是链表数据结构。特点:增删的速度很快,查询稍慢。
      Vector:底层是数组数据结构。线程同步。被ArrayList替代了。枚举就是Vector特有的取出方式。
              发现枚举和迭代器很像。其实枚举和迭代是一样的,因为枚举的名称以及方法的名称都
              过长,所以被迭代器取代了。枚举郁郁而终了。

评分

参与人数 1技术分 +2 收起 理由
宋天琪 + 2

查看全部评分

回复 使用道具 举报
无非是两种算法:

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

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

ArrayList 使用的是前面的算法。

评分

参与人数 1技术分 +1 收起 理由
宋天琪 + 1

查看全部评分

回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马