2 qixinbruce qixinbruce 于 2016.03.22 15:44 提问

ArrayList底层的动态数组怎么实现?

数组怎么实现动态分配长度?数组的长度为什么不固定?求大神讲解

3个回答

danielinbiti
danielinbiti   Ds   Rxr 2016.03.22 15:54
已采纳

没有动态,最终还是数组复制,小数组换大数组

//这是数据扩充的核心代码,最终就是arrays.copyof
 private void grow(int minCapacity) {
         // overflow-conscious code
         int oldCapacity = elementData.length;
         int newCapacity = oldCapacity + (oldCapacity >> 1);
         if (newCapacity - minCapacity < 0)
             newCapacity = minCapacity;
         if (newCapacity - MAX_ARRAY_SIZE > 0)
             newCapacity = hugeCapacity(minCapacity);
         // minCapacity is usually close to size, so this is a win:
         elementData = Arrays.copyOf(elementData, newCapacity);
     }
cock333
cock333   2016.03.22 15:57

数组的长度是固定的,arrayList的add会生成个新的“够长的数组”
elementData = Arrays.copyOf(elementData, newCapacity);
看一看源码就明白了

caozhy
caozhy   Ds   Rxr 2016.03.22 15:59

ArrayList的底层还是数组,每次分配一批,当数组不够的时候,会重新分配,然后拷贝到新的数组中。

Csdn user default icon
上传中...
上传图片
插入图片
准确详细的回答,更有利于被提问者采纳,从而获得C币。复制、灌水、广告等回答会被删除,是时候展现真正的技术了!
其他相关推荐
【数据结构】ArrayList原理及实现学习总结
一、ArrayList介绍 ArrayList是一种线性数据结构,它的底层是用数组实现的,相当于动态数组。与Java中的数组相比,它的容量能动态增长。类似于C语言中的动态申请内存,动态增长内存。 当创建一个数组的时候,就必须确定它的大小,系统会在内存中开辟一块连续的空间,用来保存数组,因此数组容量固定且无法动态改变。ArrayList在保留数组可以快速查找的优势的基础上,弥补了数组在创建后,...
深入学习java之ArrayList 实现原理(一)
最近有时间整理了一下ArrayLIst的实现原理,因为在开发项目的应用的比较多,比如在处理比较复杂的业务时候,需要遍历来查找数据和操作数据,有些时候还有到数据进行排序等,所以对经常处理业务比较多的童鞋非常熟悉,下面我就说说我理解和使用
ArrayList动态数组的使用和遍历
使用方法: http://jingyan.baidu.com/album/5bbb5a1b1f4c7613eba1790d.html?picindex=1   遍历: public class ArrayListDemo {     public static void main(String args[]){         List list = new Array
ArrayList底层原理以及使用技巧
ArrayList简介 ArrayList是我们在开发中非常常用的数据存储容器之一,其底层是数组实现的,我们可以在集合中存储任意类型的数据。ArrayList又是线程不安全的,这在接下来代码分析的过程中会有体现。ArrayList非常适合对元素进行查找,效率非常高。 源码分析 既然是分析源码,那我们先从构造函数开始。我们常用的构造函数有两个,分别是有参和无参的,如下图 无参
Java进阶--深入理解ArrayList实现原理
ArrayList简介ArrayList就是动态数组,用MSDN中的说法,就是Array的复杂版本,它提供了动态的增加和减少元素,实现了Collection和List接口,可以灵活的设置数组的大小。要注意的是ArrayList并不是线程安全的,因此一般建议在单线程中使用ArrayList。ArrayList的继承关系public class ArrayList<E> extends Abstract
动态数组的实现-ArrayList
动态数组的实现-ArrayList说完了LinkedList,来谈下另外一种常用的数组ArrayList。 可以看到他们同时实现了List接口,但是ArrayList和LinkedList的区别是LinkedList利用了双向链表的方法来进行创建,ArrayList利用了动态数组的方法,进行创建,类似于c中的动态数组申请。从他们的创建方法也可以看出来,当数据较大时候,从中间插入,从头部插入,和在尾
Java中动态数组ArrayList类的用法(转)
1、什么是ArrayListArrayList就是传说中的动态数组,用MSDN中的说法,就是Array的复杂版本,它提供了如下一些好处: 动态的增加和减少元素 实现了ICollection和IList接口 灵活的设置数组的大小2、如何使用ArrayList最简单的例子: ArrayList List = new ArrayList(); for( int i=0;i <10;i+
Java动态数组ArrayList
List 接口的大小可变数组的实现。实现了所有可选列表操作,并允许包括null 在内的所有元素。除了实现 List 接口外,此类还提供一些方法来操作内部用来存储列表的数组的大小。(此类大致上等同于Vector 类,除了此类是不同步的。) 每个 ArrayList 实例都有一个容量。该容量是指用来存储列表元素的数组的大小。它总是至少等于列表的大小。随着向 ArrayList 中不断添加元素,其容量也自动增长。
ArrayList和LinkedList原理
ArrayList: ArrayList 使用默认无参数构造函数,底层的Object数组长度默认为10,当长度不够用自动增长0.5倍 源代码: 默认长度10 /** * Default initial capacity. */ private static final int DEFAULT_CAPACITY = 10; 如果数组长度不够增长0
(java小白)如何创建一个用键盘输入的动态数组Arraylist并输出不同的数
import java.util.*;public class ArrayListTest { public static void main(String[] args) { // TODO Auto-generated method stub Scanner reader = new Scanner(System.in); ArrayList&amp;lt;Integer&amp;gt;list = n...