内功心法 -- java.util.ArrayList<E> (1)
写在前面的话:读书破万卷,编码如有神
--------------------------------------------------------------------
下文主要对java.util.ArrayList<E>进行整体性介绍,主要内容包括:
1、 ArrayList概述
2、 ArrayList中的属性、构造方法、常用方法介绍
3、 ArrayList遍历
参考内容:
1、JDK源码(1.7)
--------------------------------------------------------------------
1. ArrayList概述
java.util.ArrayList<E>是一个什么玩意,它有什么功能,我们拿ArrayList能够干嘛?
简单点说:java.util.ArrayList<E>是一个列表类,它是用来存放其他Java对象,内部是通过数组来实现的。
先看下面的图(简略图):

(1)java.util.ArrayList<E> 是一个列表,用来存放其它java对象的,只要是java对象就可以往ArrayList里面放
(2)java.util.ArrayList<E>内部是通过数组来实现的:
当数组容量不够的时候,会对数组容量进行扩容
可以通过数组下标来快速的访问ArrayList里面的元素
当新增或者删除ArrayList里面的元素时,可能会涉及到移位操作
可以截取数组的子数组操作
java.util.ArrayList<E>的定义如下:
public class ArrayList<E> extends AbstractList<E>
implements List<E>, RandomAccess, Cloneable, java.io.Serializable{
//fields //constructor //methods //inner class 'Itr' //inner class 'ListItr' //inner class 'SubList'
}
从ArrayList类的定义中可以看到,它好复杂哟,定义了那么多的东西,又有父类,又实现了接口等等,这都要怪它的'祖宗',定义了那么多的规范、规则。(@_@)
好了,不多废话,撸起袖子继续干:
下面来看看一副图:

2. ArrayList中的属性、构造方法、常用方法介绍
先来对java.util.ArrayList<E>的描述进行一些约定:
下面文中的:
'列表'代表ArrayList内部的Object[] elementData数组
'列表大小'代表ArrayList内部的Object[] elementData数组的长度
'元素'代表往ArrayList中添加的Java对象
2.1 java.util.ArrayList<E>的常见属性
//序列号
private static final long serialVersionUID = 8683452581122892189L;
//ArrayList实际存储元素的地方
private transient Object[] elementData;
//ArrayList中存储的元素个数
private int size;
//ArrayList最多存储元素的个数
private static final int MAX_ARRAY_SIZE = Integer.MAX_VALUE - 8;
//fast-fail失败机制标记
protected transient int modCount = 0;
2.2 java.util.ArrayList<E>的构造方法
第一种:默认构造方法(无参数构造方法)
public ArrayList()
第二种: 带初始列表容量大小参数的构造方法
public ArrayList(int initialCapacity)
第三种:带初始化子列表参数的构造方法
public ArrayList(Collection<? extends E> c)
2.3 java.util.ArrayList<E>的常用方法
| 修改操作 | boolean add(E e) | 将指定的元素添加到此列表的尾部 |
| void add(int index,E element) | 将指定的元素插入此列表中的指定位置 | |
| E remove(int index) | 移除此列表中指定位置上的元素 | |
| boolean remove(Object o) | 移除此列表中首次出现的指定元素 | |
| E set(int index,E element) | 用指定的元素替代此列表中指定位置上的元素 | |
| 批量操作 | boolean addAll(Collection<? extends E> c) | 将子集合c中的元素添加到此集合中 |
| boolean addAll(int index,Collection<? extends E> c) | 将子集合c中的元素添加到此集合中的index位置开始处 | |
| void clear() | 清空此集合 | |
| protected void removeRange(int fromIndex,int toIndex) | 移除集合中索引在fromIndex(包括)和toIndex(不包括)之间的所有元素 | |
| public boolean removeAll(Collection<?> c) | 移除此collection中那些也包含在指定collection中的所有元素 | |
| public boolean retainAll(Collection<?> c) | 仅保留在子集合c中那些也包含在此集合中的元素 | |
| 查询操作 | boolean contains(Object o) | 判断集合中是否包含了元素o |
| E get(int index) | 返回此集合中index位置上的元素 | |
| int indexOf(Object o) | 返回此集合中首次出现元素o的位置 | |
| boolean isEmpty() | 判断此集合是否为空 | |
| int lastIndexOf(Object o) | 返回此集合中最后一次出现元素o的位置 | |
| int size() | 返回此集合中元素的个数 | |
| 其他操作 | Object clone() | 返回此列表实例的浅复制 |
| void ensureCapaCity(int minCapacity) | 如有必要,增加此列表实例的容量,以确保它至少能够容纳最小容量参数所指定的元素数 | |
| void trimToSize() | 将此列表实例的容量调整为列表的当前大小 | |
| 数组操作 | Object[] toArray() | 按适当顺序返回包含此列表中所有元素的数组 |
| <T> T[] toArray(T[] a) | 按适当顺序返回包含此列表中所有元素的数组 | |
| Iterator和子List操作 | ListIterator<E> listIterator(int index) | 返回列表的ListIterator实例 |
| ListIterator<E> listIterator() | 返回列表的ListIterator实例 | |
| Iterator<E> iterator() | 返回列表的Iterator实例 | |
| List<E> subList(int fromIndex, int toIndex) | 返回列表的子列表 |
----------------------------------------------------------------------------------------
3. ArrayList遍历方法
java.util.ArrayList<E>支持三种遍历方式:
第一种: 通过索引值去遍历(随机遍历)
第三种: 通过增强的for循环去遍历
第三种: 通过迭代器去遍历
下面就来看看三种遍历方式的示例代码和遍历的效率比较:
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List; public class ArrayListAccessDemo {
/**
* 通过索引值去遍历(随机访问)
*/
public static void accessByIndex(List<Integer> list){
long beginTime = System.currentTimeMillis();
for(int i = 0;i < list.size();i++){
list.get(i);
}
long endTime = System.currentTimeMillis();
long totalTime = endTime - beginTime;
System.out.println("通过索引值去遍历(随机访问) 花费的时间:" + totalTime+" 毫秒"); } /**
* 通过增强的for循环去遍历
*/
public static void accessByFor(List<Integer> list){
long beginTime = System.currentTimeMillis();
for(Integer i : list){
list.get(i);
}
long endTime = System.currentTimeMillis();
long totalTime = endTime - beginTime;
System.out.println("通过增强的for循环去遍历 花费的时间:" + totalTime+" 毫秒"); } /**
* 通过Iterator迭代器去遍历
*/
public static void accessByIterator(List<Integer> list){
long beginTime = System.currentTimeMillis();
Iterator<Integer> it = list.iterator();
while(it.hasNext()){
it.next();
}
long endTime = System.currentTimeMillis();
long totalTime = endTime - beginTime;
System.out.println("通过Iterator迭代器去遍历 花费的时间:" + totalTime+" 毫秒"); } public static void main(String[] args) {
//创建一个ArrayList实例
List<Integer> list = new ArrayList<Integer>();
//往ArrayList实例中添加数据
for(int i = 0;i < 10000000;i++){
list.add(i);
} accessByIndex(list);
accessByFor(list);
accessByIterator(list);
}
} 运行结果:
ArrayList中有100W条数据时:
通过索引值去遍历(随机访问) 花费的时间:2 毫秒
通过增强的for循环去遍历 花费的时间:9 毫秒
通过Iterator迭代器去遍历 花费的时间:4 毫秒 ArrayList中有500W条数据时:
通过索引值去遍历(随机访问) 花费的时间:4 毫秒
通过增强的for循环去遍历 花费的时间:20 毫秒
通过Iterator迭代器去遍历 花费的时间:9 毫秒 ArrayList中有1000W条数据时:
通过索引值去遍历(随机访问) 花费的时间:3 毫秒
通过增强的for循环去遍历 花费的时间:32 毫秒
通过Iterator迭代器去遍历 花费的时间:13 毫秒 ArrayList中有5000W条数据时:
通过索引值去遍历(随机访问) 花费的时间:3 毫秒
通过增强的for循环去遍历 花费的时间:118 毫秒
通过Iterator迭代器去遍历 花费的时间:55 毫秒
----------------------------------------------------------------------------------------
java.util.ArrayList系列文章
java.util.ArrayList<E>(1) java.util.ArrayList<E>(2) java.util.ArrayList<E>(3)
java.util.ArrayList<E>(4) java.util.ArrayList<E>(5) java.util.ArrayList<E>(6)
相关知识
java.util.Collection<E> java.util.AbstractCollection<E> java.util.List<E>
java.util.AbstractList<E> java.util.Iterator<E> java.util.ListIterator<E>
Java中的标记接口 迭代器模式 Java中的深拷贝和浅拷贝 java.util.Arrays
内功心法 -- java.util.ArrayList<E> (1)的更多相关文章
- 内功心法 -- java.util.ArrayList<E> (2)
写在前面的话:读书破万卷,编码如有神--------------------------------------------------------------------下文主要对java.util ...
- 内功心法 -- java.util.ArrayList<E> (3)
写在前面的话:读书破万卷,编码如有神--------------------------------------------------------------------下文主要对java.util ...
- 内功心法 -- java.util.ArrayList<E> (4)
写在前面的话:读书破万卷,编码如有神--------------------------------------------------------------------下文主要对java.util ...
- 内功心法 -- java.util.ArrayList<E> (5)
写在前面的话:读书破万卷,编码如有神--------------------------------------------------------------------下文主要对java.util ...
- 内功心法 -- java.util.ArrayList<E> (6)
写在前面的话:读书破万卷,编码如有神--------------------------------------------------------------------下文主要对java.util ...
- 解决springmvc报No converter found for return value of type: class java.util.ArrayList问题
一.背景 最近闲来无事,想自己搭建一套Spring+SpringMVC+Mybatis+Mysql的环境(搭建步骤会在以后博客中给出),结果运行程序时,适用@ResponseBody注解进行返回Lis ...
- Java.util.ArrayList详解
java.util.ArrayList就是传说中的动态数组. 继承了关系,有此可看出ArrayList与list的collection的关系 public class ArrayList<E&g ...
- java@ 利用ArrayList实现dijkstra算法以及topological 排序算法(java.util.ArrayList)
package dataStructure; import java.util.ArrayList; import java.util.LinkedList; import java.util.Que ...
- java.util.ArrayList、java.util.vector和java.util.LinkedList (JDK 1.8.0_111)
一.java.util.ArrayList 1.1 ArrayList 继承结构 ArrayList实现了RandomAccess,可以随机访问(其实就是通过数组下标访问):实现了Cloneable, ...
随机推荐
- Android实时监听网络状态
Android实时监听网络状态(1) 其实手机在网络方面的的监听也比较重要,有时候我们必须实时监控这个程序的实时网络状态,android在网络断开与连接的时候都会发出广播,我们通过接收系统的广播就 ...
- eclipse注释模板设置(未整理)
Window --> Java --> Code Style --> Code Templates --> Comments --> types --> Edit ...
- C# GridView Edit & Delete, 点击Delete的时候弹出确认框
1. 使用GridView自带属性ShowEditButton和ShowDeleteButton,均设为True <Columns> ... <asp:CommandField S ...
- CLR VIA C#: 基元类型、 引用类型 和 值类型
一.基元类型 . 引用类型 和 值类型的区别: 1.基元类型(primitive type):编译器直接支持的数据类型: 基元类型 直接映射到 FCL 中存在的类型. C# 小写是基元类型,例如:st ...
- EasyUI--datebox设置默认时间
1. html代码: <input id="txtBeginTime" class="easyui-datebox" data-options=" ...
- vs2015编译mysql c++ connector
目前MySQL Connector/C++的binary版本最高只支持VS2008,VS2015需要下载源码自行编译. 1.CMAKE 到官网下载最新的稳定版本 把bin目录添加到环境变量PATH中 ...
- CodeForces 755C PolandBall and Forest (并查集)
题意:给定每一点离他最远的点,问是这个森林里有多少棵树. 析:并查集,最后统计不同根结点的数目即可. 代码如下: #pragma comment(linker, "/STACK:102400 ...
- UVa 10400 - Game Show Math
题目大意:给出n(n<100)个正整数和一个目标数,按照给出数的顺序,运用+.-.*./四则运算(不考虑优先级),判断能否得出所要的结果. 首先考虑的就是暴力枚举,不过时间复杂度为O(4n),会 ...
- HTML5定稿:手机App将三年内消失,互联网世界的第二次大战
HTML5与app以对立竞争的产品形态展现在大众视野.从去年开始又有一大批技术派或者创业者盯向html5领域,移动游戏的爆发和微信朋友圈等众多平台为HTML5导流,能不能颠覆,或许只是时间上的问题. ...
- CSS中设置margin:0 auto; 水平居中无效的原因分析
很多初学制作网页的朋友,可能会遇到的一个常见问题,就是在CSS中加了margin:0 auto;却没有效果,不能居中的问题,margin:0 auto;的意思就是:上下边界为0,左右根据宽度自适应,其 ...