大杂烩 -- ArrayList的动态增长 源码分析
2024-09-08 21:34:58
基础大杂烩 -- 目录
-- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
问题:当ArrayList中放入的元素一直增加会如何增长数组长度???
Class : ArrayList
public class ArrayList<E> extends AbstractList<E> implements List<E>, RandomAccess, Cloneable, java.io.Serializable { /**
* 默认容量值
*/
private static final int DEFAULT_CAPACITY = 10; /**
* 默认容量为空的数组
*/
private static final Object[] DEFAULTCAPACITY_EMPTY_ELEMENTDATA = {}; /**
* 用来存储元素
*/
transient Object[] elementData; /**
* 数组大小
*
* @serial
*/
private int size; /**
* 添加元素
*
* @param e
* @return
*/
public boolean add(E e) {
ensureCapacityInternal(size + 1);
elementData[size++] = e;
return true;
} /**
* 确保容量动态增长
*
* @param minCapacity
*/
private void ensureCapacityInternal(int minCapacity) {
if (elementData == DEFAULTCAPACITY_EMPTY_ELEMENTDATA) {
minCapacity = Math.max(DEFAULT_CAPACITY, minCapacity);
} ensureExplicitCapacity(minCapacity);
} /**
* 确定新的容量
*
* @param minCapacity
*/
private void ensureExplicitCapacity(int minCapacity) {
modCount++; if (minCapacity - elementData.length > 0)
grow(minCapacity);
} /**
* 数组最大大小
*/
private static final int MAX_ARRAY_SIZE = Integer.MAX_VALUE - 8; /**
* 数组容量动态增长
*
*/
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);
} /**
* 计算数组最终容量
*
* @param minCapacity
* @return
*/
private static int hugeCapacity(int minCapacity) {
if (minCapacity < 0) // overflow
throw new OutOfMemoryError();
return (minCapacity > MAX_ARRAY_SIZE) ? Integer.MAX_VALUE : MAX_ARRAY_SIZE;
}
}
Class : Arrays
@SuppressWarnings("unchecked")
public static <T> T[] copyOf(T[] original, int newLength) {
return (T[]) copyOf(original, newLength, original.getClass());
}
public static <T,U> T[] copyOf(U[] original, int newLength, Class<? extends T[]> newType) {
@SuppressWarnings("unchecked")
T[] copy = ((Object)newType == (Object)Object[].class)
? (T[]) new Object[newLength]
: (T[]) Array.newInstance(newType.getComponentType(), newLength);
System.arraycopy(original, 0, copy, 0,
Math.min(original.length, newLength));
return copy;
}
Class : System
public static native void arraycopy(Object src, int srcPos,
Object dest, int destPos,
int length);
总的来说依旧是调用System类中native方法重新创造一个数组。
啦啦啦
最新文章
- 新浪微博客户端(40)-使用AFN发送带图片的微博
- fedora23的firefox不能播放优酷视频?
- [BZOJ 1303] [CQOI2009] 中位数图 【0.0】
- 8个常用的Android开发工具
- SharePoint BCS
- jQuery.form Ajax无刷新上传错误 (jQuery.handleError is not a function) 解决方案
- StreamWriter(ms, new UTF8Encoding(false))可以达到不输出BOM的需求。
- Edward&#39;s Cola Plan
- JDBC知识详解
- 利用js实现 禁用浏览器后退
- 从HTTL模板引擎看软件设计原则
- centos安装php7.2环境
- 安装bootcamp时提示“找不到$winpedriver$文件夹,请验证该文件夹是否和bootcamp处于同一文件夹内?”
- 简单分析下mybatis中mapper文件中小知识
- 删除一个cjson导致系统死机
- lesson7-图像描述 -小象cv
- Idea集成Lombok代码注释来精简代码
- jenkins部署war包到远程服务器的tomcat
- Unity3D笔记 英保通六 角色控制器
- Linux实验楼学习之三