一步一步解析集合框架ArrayList源码(2)
2016-07-29 13:38
519 查看
我在阅读源码的过程中很多时候是没有头绪的。所以为了避免大家也遇到这种状况,源码不求全求大,做到“透过实践看源码”,分块分层。
首先对ArrayList做个总体介绍:
修改集合元素
输出结果: first
第一个
源码分析:
删除集合元素
输出结果:
说明删除成功,已经不存在”second”的元素值。
源码分析:
首先对ArrayList做个总体介绍:
ArrayList的底层存储结构是数组,实际上在这个类中真正保存数据的是内部定义的一个数组,自身的数据操作只是封装了数组的操作!
修改集合元素
public static void main(String[] args) { ArrayList<String> list=new ArrayList<String>(); list.add("first"); list.add("second"); String ele1=list.get(0); System.out.println(ele1); list.set(0,"第一个"); System.out.println(list.get(0)); }
输出结果: first
第一个
源码分析:
/** * 替换,设置; * 将索引index的元素值设置为element * 返回原索引的元素值 */ public E set(int index, E element) { rangeCheck(index); E oldValue = elementData(index); elementData[index] = element; return oldValue; }
删除集合元素
public static void main(String[] args) { ArrayList<String> list=new ArrayList<String>(); list.add("first"); list.add("second"); System.out.println(list.remove(1)); System.out.println(list.get(1)); }
输出结果:
second Exception in thread "main" java.lang.IndexOutOfBoundsException: Index: 1, Size: 1
说明删除成功,已经不存在”second”的元素值。
源码分析:
/** *通过索引删除元素,返回删除的元素值 */ public E remove(int index) { rangeCheck(index); modCount++; //删除前的索引元素值 E oldValue = elementData(index); //计算要复制的长度,即从index+1至最后一个元素共计多少 int numMoved = size - index - 1; if (numMoved > 0) /** * 第一个参数:原数组, * 第二个参数:复制开始索引, * 第三个参数:目标数组, * 第四个参数:目标数组复制开始索引, * 第五个参数:复制长度 */ System.arraycopy(elementData, index+1, elementData, index, numMoved); //清空最后一个元素值 elementData[--size] = null; return oldValue; }
/** *根据元素值进行删除 */ public boolean remove(Object o) { //遍历数组elementData,比较进行删除 if (o == null) { for (int index = 0; index < size; index++) if (elementData[index] == null) { fastRemove(index); return true; } } else { for (int index = 0; index < size; index++) if (o.equals(elementData[index])) { fastRemove(index); return true; } } return false; } /* * 私有方法; * 删除索引index元素值 */ private void fastRemove(int index) { modCount++; int numMoved = size - index - 1; if (numMoved > 0) System.arraycopy(elementData, index+1, elementData, index, numMoved); elementData[--size] = null; }
相关文章推荐
- C#编写的获取天气信息
- VS2010静态编译生成.exe可执行文件
- django 添加comments app
- sphinx 配置文件全解析
- poj2488 A Knight's Journey
- 几种外链的方法
- AFNetworking 的核心 AFURLSessionManager(二)
- android studio 如何打包成jar包
- vectorLine画线
- 【经验总结】tcp_tw_recycle参数引发的故障
- 中软Java学习笔记第四天
- css 过度
- HDU3449 Consumer(依赖背包)
- 一看就明白的爬虫入门讲解:基础理论篇
- Effective C++_Item4笔记
- JS 中枚举的使用方法
- Makefile 中:= ?= += =的区别
- paramiko安装报错ImportError: No module named cryptography.hazmat.backends
- java正则最短匹配
- linux:文件系统的系统调用