大杂烩 -- ArrayList的动态增长 源码分析
源码 分析 -- 动态 增长 ArrayList
2023-09-11 14:14:57 时间
基础大杂烩 -- 目录
-- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
问题:当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方法重新创造一个数组。
啦啦啦
相关文章
- Flask WTForms的使用和源码分析 —— (7)
- Android系统加载Apk文件的时机和流程分析(1)--Android 4.4.4 r1的源码
- Java容器 | 基于源码分析List集合体系
- SpringCloud容错处理:Hystrix源码分析
- 86 爬虫 - scrapy-redis源码分析(pipelines)
- Storm-源码分析-EventManager (backtype.storm.event)
- Storm-源码分析-Topology Submit-Executor-mk-threads
- Spark源码分析 -- SchedulableBuilder
- 《Ceph源码分析》——第2章,第6节SafeTimer
- 《Ceph源码分析》——导读
- UCOSiii源码分析——os_time.c
- Hadoop源码分析之读文件时NameNode和DataNode的处理过程
- git克隆源码时提示fatal: HTTP request failed怎么办?
- 通过前端控制器源码分析springmvc的执行过程
- Python 数据分析教程之在构建机器学习模型之前如何分析数据?(教程含源码)
- tomcat加载web.xml的过程---StandardContext、ContextConfig源码分析
- Qt源码分析之QObject
- 【毕业设计_课程设计】基于特征熵值分析的网站分类系统实现(源码+论文)
- 【转】WebMagic-总体流程源码分析
- ConcurrentHashMap1.7源码分析
- Java程序员从笨鸟到菜鸟之(五十二)细谈Hibernate(三)Hibernate常用API详解及源码分析--csdn 曹胜欢
- zookeeper配置中心实战--solrcloud zookeeper配置中心原理及源码分析
- spring remoting源码分析--Hessian分析
- spring transaction源码分析--事务架构
- quartz集群调度机制调研及源码分析---转载
- 曹工说mini-dubbo(2)--分析eureka client源码,想办法把我们的服务提供者注册到eureka server(上)
- HashMap实现原理分析(源码分析,ReHash,)