小白学习之路(三):java ArrayList源码add操作和remove操作学习
来源:互联网 发布:免费java教程视频下载 编辑:程序博客网 时间:2024/06/05 20:32
今天稍微看了下jdk 源码中 ArrayList 的两个常用操作add 和 remove 以下是个人学习心得,个人学习记录,如有错误,欢迎大家纠正。
ArrayList 实际上就是构建一个可变长度大小数组对象,每个ArrayList 对象维护一个对象数组,初始化空构造器默认初始化大小为10的对象数组,当然,也可以自定义长度。
先是add操作。上源码。
/** * Appends the specified element to the end of this list. * * @param e element to be appended to this list * @return <tt>true</tt> (as specified by {@link Collection#add}) */ public boolean add(E e) { ensureCapacityInternal(size + 1); // Increments modCount!! elementData[size++] = e; return true; }容易发现首先调用了一个方法ensureCapacityInternal(size +1 ),顾名思义就是增加了一个元素之后,确保对象数组长度是否足够大。接下来,
private void ensureCapacityInternal(int minCapacity) { if (elementData == EMPTY_ELEMENTDATA) { minCapacity = Math.max(DEFAULT_CAPACITY, minCapacity); } ensureExplicitCapacity(minCapacity); }先是一个判断当前对象数组是否为空数组,若是则把默认大小和当前预计大小做一个大小比较,挑出较大的作为扩展后数组的长度。然后,
private void ensureExplicitCapacity(int minCapacity) { modCount++; // overflow-conscious code if (minCapacity - elementData.length > 0) grow(minCapacity); }判断当前初始化的数组长度是否大于目标预计的大小,如果是,则不需要扩展,如果不是则调用grow操作执行实际扩展。
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); }可见,在老容量前提上得到一个预计新容量newCapacity,看看newCapacity是否足够大过请求的目标容量minCapacity,如果不是,则将较大的赋值给newCapacity,最后调用Arrays的方法构建一个newCapacity大小的数组。
remove操作如下:
public E remove(int index) { rangeCheck(index); modCount++; E oldValue = elementData(index); int numMoved = size - index - 1; if (numMoved > 0) System.arraycopy(elementData, index+1, elementData, index, numMoved); elementData[--size] = null; // clear to let GC do its work return oldValue; }还是首先判断index是否超出边界,然后numMoved是指被移除的元素后面还有元素的个数,然后将index+1往后的元素在同一个数组内均前移一位,达到最后目的。
0 0
- 小白学习之路(三):java ArrayList源码add操作和remove操作学习
- MongoDB学习之三----Java操作MongoDB
- 数据结构之解析ArrayList源码的add,remove,set,contains
- java中ArrayList源码方法理解--add(),remove()
- 源码学习之ArrayList
- java源码学习-----ArrayList
- java ArrayList源码学习
- JAVA源码学习-ArrayList
- java源码学习----ArrayList
- Java集合之ArrayList源码概览学习
- Java集合ArrayList和HashMap源码学习
- 集合源码学习(三):ArrayList
- ArrayList与LinkedList大比拼之add和remove
- 数据结构学习之栈和栈的操作源码
- Java学习之ArrayList
- Java学习之ArrayList
- Java学习之ArrayList
- JDK源码学习之ArrayList
- jsp页面出现Multiple annotations found at this line: - The superclass "javax.servlet.http.HttpServlet" w
- JAVA版暴力破解含验证码
- could not initialize proxy - no Session
- Android消息处理机制Thread、Handler、Looper
- ERLANG recon使用示例
- 小白学习之路(三):java ArrayList源码add操作和remove操作学习
- OSG学习——配置问题
- 解决odroid-XU3的HDMI输出问题
- Android MessageDigest简介
- 年轻程序员需要学习的5大经验
- python中QStringList与QString、String互转
- 详解 Spring 3.0 基于 Annotation 的依赖注入实现----注解详解
- - error: creating resource for external package android: id/ SecondaryProgress. - note: did you m
- android addJavascriptInterface 不能生效 解决办法