当前位置: 代码迷 >> J2SE >> JAVA里,ArrayList在内存分配上究竟是怎样的?解决方案
  详细解决方案

JAVA里,ArrayList在内存分配上究竟是怎样的?解决方案

热度:44   发布时间:2016-04-23 20:31:19.0
JAVA里,ArrayList在内存分配上究竟是怎样的?
本帖最后由 huge92 于 2014-07-19 20:58:16 编辑
初学者,如果猜得不对,还请大家指正:

以下是我的猜测:

1)
ArrayList:
初始化的时候不指定元素个数:在不同的时刻对其增删插,元素在内存中不可能连续(中间的内存会被其他对象占掉);


初始化的时候指定元素个数:可以暂时连续存储,但后期如果在不同的时刻对其增删插,元素也不可能连续。


因此,在索引ArrayList时,速度往往会比数组慢(但我猜这背后肯定会有一些优化机制,当然这种慢,在需要ArrayList的时候是可以原谅的)。

另外,ArrayList的内存模型是什么?有人说是队列,但队列是只允许在一端进行插入,而在另一端进行删除的运算受限的线性表,貌似不对吧?

2)ArrayList背后就是数组,增加的时候容量不够会新建一个数组把原来的东西放进去,不过这样貌似效率会很低。
------解决方案--------------------
可以理解为动态数组或可变数组,效率相对于一般的数组来说,可能要差些;
------解决方案--------------------
内部是数组实现的,看名字就看出来了,java里面还有LinkedList,内存是动态分配的。
------解决方案--------------------
你这样胡乱猜测不如安心看一下源码。。思而不学则殆

ArrayList是用数组实现的,这个数组的内存是连续的,不存在你说的相邻元素之间还隔着其他内存什么的
索引ArrayList时,速度比原生数组慢是因为你要用get方法,这是一个函数调用,而数组直接用[ ]访问,相当于直接操作内存地址,速度当然比函数调用快
------解决方案--------------------
1、新建ArrayList的时候,JVM为其分配一个默认或指定大小的连续内存区域(封装为数组)

2、每次增加元素会检查容量,不足则创建新的连续内存区域(大小等于初始大小+步长),也用数组形式封装,并将原来的内存区域数据复制到新的内存区域,然后再用ArrayList中引用原来封装的数组对象的引用变量引用到新的数组对象:

elementData = Arrays.copyOf(elementData, newCapacity);
  相关解决方案