Java中ArrayList源码解析
2016-01-12 12:23
603 查看
一、ArrayList的创建
ArrayList的实质就是一个Object数组。
当创建一个ArrayList的时候,内部就会创建一个Object数组。ArrayList的构造函数由三种情况。
(1)
(2)
(3)
所以我们一般创建一个ArrayList对象的时候,实质时创建了一个Object类型的elementData的数组。
二、添加元素
添加元素的过程就是elementData数组顺序指向每个添加元素的过程。
三、删除元素
删除过程就是数组的平移过程,将数组中要删除元素后面的所有元素前移一位,这样就将要删除的元素覆盖掉了,然后将最后一个算是置为null就完成了这个删除过程。
后面其他操作基本差不多,核心思想需要掌握的就是它是一个顺序的数组,完成对ArrayList的增删查改的过程其实跟完成对数组的增删查改的过程是一样的。
另外我们从上面可以看出:
(1)ArrayList不是线程安全的
(2)因为ArrayList内部实质是一个Object数组,所以在添加获取元素的时候,可能会引起拆箱装箱的操作。
ArrayList的实质就是一个Object数组。
当创建一个ArrayList的时候,内部就会创建一个Object数组。ArrayList的构造函数由三种情况。
(1)
public ArrayList(int initialCapacity)
(2)
public ArrayList()
(3)
public ArrayList(Collection<? extends E> c)
所以我们一般创建一个ArrayList对象的时候,实质时创建了一个Object类型的elementData的数组。
二、添加元素
添加元素的过程就是elementData数组顺序指向每个添加元素的过程。
三、删除元素
删除过程就是数组的平移过程,将数组中要删除元素后面的所有元素前移一位,这样就将要删除的元素覆盖掉了,然后将最后一个算是置为null就完成了这个删除过程。
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; } public boolean remove(Object o) { 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; }
后面其他操作基本差不多,核心思想需要掌握的就是它是一个顺序的数组,完成对ArrayList的增删查改的过程其实跟完成对数组的增删查改的过程是一样的。
另外我们从上面可以看出:
(1)ArrayList不是线程安全的
(2)因为ArrayList内部实质是一个Object数组,所以在添加获取元素的时候,可能会引起拆箱装箱的操作。
相关文章推荐
- Java生成文件
- Spring 无法注入静态变量,直接在静态方法中获取bean
- Windows系统下查看JDK的版本和安装路径!
- Thinking in Java,Fourth Edition(Java 编程思想,第四版)学习笔记(十)之Inner Classes
- 待翻译---- Understanding Spring MVC Model and Session Attributes
- [javase学习笔记]-9.2 单继承与多重继承
- Java进阶(二十二)使用FileOutputStream写入文件
- Java进阶(二十二)使用FileOutputStream写入文件
- java中创建新进程的两种方法
- MySQL与Eclipse或者MyEclipse的连接
- Spring MVC 中 怎样从一个Controller 方法跳转到另一个方法,注意是跳转,不是调用
- 你不知道的JAVA
- 让JAVA代码跑得更快
- Struts2中DMI(动态方法调用)的一些问题
- 【JavaWeb Structs2学习】 用Action接受参数
- 关于Eclipse 插件添加右键菜单的三种方法
- 【Java基础 1】Java2平台的三个版本介绍
- 【Java 理论篇 1】Java2平台的三个版本介绍
- Struts2配置详解_配置Action
- Spring学习笔记---2.1-IOC容器解析Bean配置信息