首先,ArrayList定义只定义类两个私有属性:

/**
* The array buffer into which the elements of the ArrayList are stored.
* The capacity of the ArrayList is the length of this array buffer.
*/
private transient Object[] elementData; /**
* The size of the ArrayList (the number of elements it contains).
*
* @serial
*/
private int size;

可知:elementData存储ArrayList内的元素,size表示它包含的元素的数量(不是指容量)。

注意:elementData用transient修饰,这表明当持久化ArrayList对象时,并不会保存它。

ArrayList是基于数组实现的,添加元素时,将某个位置的值设置为指定元素即可,但数组容量不够,如何扩容呢?

我们提供具体的方法来分析:

add方法:

// 将指定的元素添加到此列表的尾部。
public boolean add(E e) {
ensureCapacity(size + 1); //判断容量是否足够,不够就扩容
elementData[size++] = e;
return true;
}

那么扩容的核心在于ensureCapacity方法

ensureCapacity方法:

public void ensureCapacity(int minCapacity) {
modCount++;
int oldCapacity = elementData.length;
if (minCapacity > oldCapacity) { //size+1即添加后的长度,判断如果添加,会不会过长
Object oldData[] = elementData;
int newCapacity = (oldCapacity * 3)/2 + 1; //1.5倍扩容
if (newCapacity < minCapacity)
newCapacity = minCapacity;
// minCapacity is usually close to size, so this is a win:
elementData = Arrays.copyOf(elementData, newCapacity); //将老数组拷贝一份到新数组
}
}

可知:

1. 每次添加前都会判断是否会过长,会,则先扩容

2. 每次扩容都是1.5倍扩容,其实是1.5倍+1。

3. 老数组通过Arrays.copyOf()拷贝一份到新数组

那么问题来了,每次扩容都是1.5倍是否会造成较大的空间浪费?

是的,所以建议在构造ArrayList实例时,就预估大小并指定其容量,以避免数组扩容的发生。或者根据实际需求,直接调用ensureCapacity方法来手动增加ArrayList实例的容量。

最新文章

  1. [转]thinkphp 模板显示display和assign的用法
  2. 用php生成一个excel文件(原理)
  3. PCA9554
  4. 『c++』 模板(template)--- 参数化多态性
  5. csharp: DataTable Rename ColumnName and remove Column
  6. CORDIC原理与FPGA实现(1)
  7. 利用JAXB实现java实体类和xml互相转换
  8. php核心知识要点
  9. SignalR Troubleshooting
  10. destoon实现调用当前栏目分类及子分类和三级分类的方法
  11. OpenMeetings(3)----启动顺序解析
  12. Mac OS下SVN的使用:服务的和客户端
  13. Dragon Balls
  14. Spring MVC简单原理
  15. MQTT报文格式
  16. [模板] 区间mex &amp;&amp; 区间元素种数
  17. DAG路径覆盖模型
  18. JavaSE| 面向对象-类的五大成员
  19. 用python实现数学多元数学方程式计算
  20. 利用jQuery进行三行两列等高布局

热门文章

  1. ios笔试题(选择题)
  2. 02.ZooKeeper的Java客户端使用
  3. PHP array_merge() 函数
  4. django post 403解决之道(最新版Django)
  5. 转载hiberinate的懒加载
  6. gdb常见命令(未完,待续)
  7. SignalR 循序渐进(五)多个Hub服务器下的消息订阅
  8. mysql数据类型字段插入空字符串自动填充为0报错
  9. python基础-第十一篇-11.1JavaScript基础
  10. Git Extension工具安装及使用