java list<e>_内功心法 -- java.util.ArrayList<E> (1)

写在前面的话:读书破万卷,编码如有神

--------------------------------------------------------------------

下文主要对java.util.ArrayList进行整体性介绍,主要内容包括:

1、 ArrayList概述

2、 ArrayList中的属性、构造方法、常用方法介绍

3、 ArrayList遍历

参考内容:

1、JDK源码(1.7)

--------------------------------------------------------------------

1. ArrayList概述

java.util.ArrayList是一个什么玩意,它有什么功能,我们拿ArrayList能够干嘛?

简单点说:java.util.ArrayList是一个列表类,它是用来存放其他Java对象,内部是通过数组来实现的。

先看下面的图(简略图):

e17a2518bdab7682a8d6c0aa2f6afcee.png

(1)java.util.ArrayList 是一个列表,用来存放其它java对象的,只要是java对象就可以往ArrayList里面放

(2)java.util.ArrayList内部是通过数组来实现的:

当数组容量不够的时候,会对数组容量进行扩容

可以通过数组下标来快速的访问ArrayList里面的元素

当新增或者删除ArrayList里面的元素时,可能会涉及到移位操作

可以截取数组的子数组操作

java.util.ArrayList的定义如下:

1 public class ArrayList extends AbstractList

2 implements List, RandomAccess, Cloneable, java.io.Serializable{3 //fields4

5 //constructor6

7 //methods8

9 //inner class 'Itr'10

11 //inner class 'ListItr'12

13 //inner class 'SubList'

14 }

从ArrayList类的定义中可以看到,它好复杂哟,定义了那么多的东西,又有父类,又实现了接口等等,这都要怪它的'祖宗',定义了那么多的规范、规则。(@_@)

好了,不多废话,撸起袖子继续干:

下面来看看一副图:

19d5b48905e38e04753809e5b5e5b20b.png

2. ArrayList中的属性、构造方法、常用方法介绍

先来对java.util.ArrayList的描述进行一些约定:

下面文中的:

'列表'代表ArrayList内部的Object[] elementData数组

'列表大小'代表ArrayList内部的Object[] elementData数组的长度

'元素'代表往ArrayList中添加的Java对象

2.1 java.util.ArrayList的常见属性

1 //序列号

2 private static final long serialVersionUID = 8683452581122892189L;3 //ArrayList实际存储元素的地方

4 private transientObject[] elementData;5 //ArrayList中存储的元素个数

6 private intsize;7 //ArrayList最多存储元素的个数

8 private static final int MAX_ARRAY_SIZE = Integer.MAX_VALUE - 8;9 //fast-fail失败机制标记

10 protected transient int modCount = 0;

2.2 java.util.ArrayList的构造方法

第一种:默认构造方法(无参数构造方法)

1 publicArrayList()

第二种: 带初始列表容量大小参数的构造方法

1 public ArrayList(intinitialCapacity)

第三种:带初始化子列表参数的构造方法

1 public ArrayList(Collection extends E>c)

2.3 java.util.ArrayList的常用方法

修改操作

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[] toArray(T[] a)

按适当顺序返回包含此列表中所有元素的数组

Iterator和子List操作

ListIterator listIterator(int index)

返回列表的ListIterator实例

ListIterator listIterator()

返回列表的ListIterator实例

Iterator iterator()

返回列表的Iterator实例

List subList(int fromIndex, int toIndex)

返回列表的子列表

----------------------------------------------------------------------------------------

3. ArrayList遍历方法

java.util.ArrayList支持三种遍历方式:

第一种: 通过索引值去遍历(随机遍历)

第三种: 通过增强的for循环去遍历

第三种: 通过迭代器去遍历

下面就来看看三种遍历方式的示例代码和遍历的效率比较:

8f900a89c6347c561fdf2122f13be562.png

961ddebeb323a10fe0623af514929fc1.png

1 importjava.util.ArrayList;2 importjava.util.Iterator;3 importjava.util.List;4

5

6 public classArrayListAccessDemo {7 /**

8 * 通过索引值去遍历(随机访问)9 */

10 public static void accessByIndex(Listlist){11 long beginTime =System.currentTimeMillis();12 for(int i = 0;i < list.size();i++){13 list.get(i);14 }15 long endTime =System.currentTimeMillis();16 long totalTime = endTime -beginTime;17 System.out.println("通过索引值去遍历(随机访问) 花费的时间:" + totalTime+" 毫秒");18

19 }20

21 /**

22 * 通过增强的for循环去遍历23 */

24 public static void accessByFor(Listlist){25 long beginTime =System.currentTimeMillis();26 for(Integer i : list){27 list.get(i);28 }29 long endTime =System.currentTimeMillis();30 long totalTime = endTime -beginTime;31 System.out.println("通过增强的for循环去遍历 花费的时间:" + totalTime+" 毫秒");32

33 }34

35 /**

36 * 通过Iterator迭代器去遍历37 */

38 public static void accessByIterator(Listlist){39 long beginTime =System.currentTimeMillis();40 Iterator it =list.iterator();41 while(it.hasNext()){42 it.next();43 }44 long endTime =System.currentTimeMillis();45 long totalTime = endTime -beginTime;46 System.out.println("通过Iterator迭代器去遍历 花费的时间:" + totalTime+" 毫秒");47

48 }49

50 public static voidmain(String[] args) {51 //创建一个ArrayList实例

52 List list = new ArrayList();53 //往ArrayList实例中添加数据

54 for(int i = 0;i < 10000000;i++){55 list.add(i);56 }57

58 accessByIndex(list);59 accessByFor(list);60 accessByIterator(list);61 }62 }63

64 运行结果:65 ArrayList中有100W条数据时:66 通过索引值去遍历(随机访问) 花费的时间:2毫秒67 通过增强的for循环去遍历 花费的时间:9毫秒68 通过Iterator迭代器去遍历 花费的时间:4毫秒69

70 ArrayList中有500W条数据时:71 通过索引值去遍历(随机访问) 花费的时间:4毫秒72 通过增强的for循环去遍历 花费的时间:20毫秒73 通过Iterator迭代器去遍历 花费的时间:9毫秒74

75 ArrayList中有1000W条数据时:76 通过索引值去遍历(随机访问) 花费的时间:3毫秒77 通过增强的for循环去遍历 花费的时间:32毫秒78 通过Iterator迭代器去遍历 花费的时间:13毫秒79

80 ArrayList中有5000W条数据时:81 通过索引值去遍历(随机访问) 花费的时间:3毫秒82 通过增强的for循环去遍历 花费的时间:118毫秒83 通过Iterator迭代器去遍历 花费的时间:55 毫秒

View Code

----------------------------------------------------------------------------------------

java.util.ArrayList系列文章

相关知识

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值