写在前面的话:读书破万卷,编码如有神
--------------------------------------------------------------------
下文主要对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)的更多相关文章

  1. 内功心法 -- java.util.ArrayList<E> (2)

    写在前面的话:读书破万卷,编码如有神--------------------------------------------------------------------下文主要对java.util ...

  2. 内功心法 -- java.util.ArrayList<E> (3)

    写在前面的话:读书破万卷,编码如有神--------------------------------------------------------------------下文主要对java.util ...

  3. 内功心法 -- java.util.ArrayList<E> (4)

    写在前面的话:读书破万卷,编码如有神--------------------------------------------------------------------下文主要对java.util ...

  4. 内功心法 -- java.util.ArrayList<E> (5)

    写在前面的话:读书破万卷,编码如有神--------------------------------------------------------------------下文主要对java.util ...

  5. 内功心法 -- java.util.ArrayList<E> (6)

    写在前面的话:读书破万卷,编码如有神--------------------------------------------------------------------下文主要对java.util ...

  6. 解决springmvc报No converter found for return value of type: class java.util.ArrayList问题

    一.背景 最近闲来无事,想自己搭建一套Spring+SpringMVC+Mybatis+Mysql的环境(搭建步骤会在以后博客中给出),结果运行程序时,适用@ResponseBody注解进行返回Lis ...

  7. Java.util.ArrayList详解

    java.util.ArrayList就是传说中的动态数组. 继承了关系,有此可看出ArrayList与list的collection的关系 public class ArrayList<E&g ...

  8. java@ 利用ArrayList实现dijkstra算法以及topological 排序算法(java.util.ArrayList)

    package dataStructure; import java.util.ArrayList; import java.util.LinkedList; import java.util.Que ...

  9. java.util.ArrayList、java.util.vector和java.util.LinkedList (JDK 1.8.0_111)

    一.java.util.ArrayList 1.1 ArrayList 继承结构 ArrayList实现了RandomAccess,可以随机访问(其实就是通过数组下标访问):实现了Cloneable, ...

随机推荐

  1. Ubuntu如何备份和恢复系统 - 落花往事的日志 - 网易博客

    在 使用Ubuntu之前,相信很多人都有过使用Windows系统的经历.如果你备份过Windows系统,那么你一定记忆犹新:首先需要找到一个备份工 具(通常都是私有软件),然后重启电脑进入备份工具提供 ...

  2. Javascript Jquery 中的数组定义与操作_子木玲_新浪博客

    body{ font-family: "Microsoft YaHei UI","Microsoft YaHei",SimSun,"Segoe UI& ...

  3. opencv图像特征检测之斑点检测

    前面说过,图像特征点检测包括角点和斑点,今天来说说斑点,斑点是指二维图像中和周围颜色有颜色差异和灰度差异的区域,因为斑点代表的是一个区域,所以其相对于单纯的角点,具有更好的稳定性和更好的抗干扰能力. ...

  4. :after和:before中的content(放入icon)

    作者:zccst 最近见到一种图标写在content里的用法,觉得很新奇.查了一下是webfont. 问题:以下是我看到的一段css的源代码,其实就是在分享到为微博的时候的图标 a#end_cc, a ...

  5. 学习c++语言应该牢记的50条准则,同样学习其他语言也一样

    1.把C++当成一门新的语言学习(和C没啥关系!真的.): 2.看<Thinking In C++>,不要看<C++变成死相>: 3.看<The C++ Programm ...

  6. T4模板使用

    本例使用的数据库是Northwind 1.新建tt文本模板customer.tt 2. 修改customer.tt内容为 <#@ template debug="false" ...

  7. java系列--批量处理

    批量删除 批量更新 二.分页 1.基于sql语句 1).基于ROWID分页 2).基于RONUM分页 3).基于数据分析分页 2.基于结果集

  8. SVN和Git的一些用法总结

    (A)SVN (1)查看日志提交的时候一般会写上注释,如果要查看提交日志,用以下命令: 1 svn log -l 4 其中,-l 4表示只查看最近4条日志(也可以没有这样的参数,就表示查看所有日志). ...

  9. mysql配置主从数据库

    1.目的 1.1 实现数据备份 1.2 项目访问时可以实现读写分离,提高访问和操作数据的速度<读写分离好处> 2.背景 这次的主从配置主要实现主库数据的改变可以实现同步到从库中: 此次试验 ...

  10. Android组件生命周期(二)

    引言 应用程序组件有一个生命周期——一开始Android实例化他们响应意图,直到结束实例被销毁.在这期间,他们有时候处于激活状态,有时候处于非激活状态:对于活动,对用户有时候可见,有时候不可见.组件生 ...