内功心法 -- java.util.ArrayList<E> (1)
来源:互联网 发布:面试官面试技巧知乎 编辑:程序博客网 时间:2024/05/29 17:30
写在前面的话:读书破万卷,编码如有神
--------------------------------------------------------------------
下文主要对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>的定义如下:
1 public class ArrayList<E> extends AbstractList<E> 2 implements List<E>, RandomAccess, Cloneable, java.io.Serializable{ 3 //fields 4 5 //constructor 6 7 //methods 8 9 //inner class 'Itr'10 11 //inner class 'ListItr'12 13 //inner class 'SubList'14 }
从ArrayList类的定义中可以看到,它好复杂哟,定义了那么多的东西,又有父类,又实现了接口等等,这都要怪它的'祖宗',定义了那么多的规范、规则。(@_@)
好了,不多废话,撸起袖子继续干:
下面来看看一副图:
2. ArrayList中的属性、构造方法、常用方法介绍
先来对java.util.ArrayList<E>的描述进行一些约定:
下面文中的:
'列表'代表ArrayList内部的Object[] elementData数组
'列表大小'代表ArrayList内部的Object[] elementData数组的长度
'元素'代表往ArrayList中添加的Java对象
2.1 java.util.ArrayList<E>的常见属性
1 //序列号 2 private static final long serialVersionUID = 8683452581122892189L; 3 //ArrayList实际存储元素的地方 4 private transient Object[] elementData; 5 //ArrayList中存储的元素个数 6 private int size; 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<E>的构造方法
第一种:默认构造方法(无参数构造方法)
1 public ArrayList()
第二种: 带初始列表容量大小参数的构造方法
1 public ArrayList(int initialCapacity)
第三种:带初始化子列表参数的构造方法
1 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)判断集合中是否包含了元素oE 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循环去遍历
第三种: 通过迭代器去遍历
下面就来看看三种遍历方式的示例代码和遍历的效率比较:
1 import java.util.ArrayList; 2 import java.util.Iterator; 3 import java.util.List; 4 5 6 public class ArrayListAccessDemo { 7 /** 8 * 通过索引值去遍历(随机访问) 9 */10 public static void accessByIndex(List<Integer> list){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(List<Integer> list){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(List<Integer> list){39 long beginTime = System.currentTimeMillis();40 Iterator<Integer> 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 void main(String[] args) {51 //创建一个ArrayList实例52 List<Integer> list = new ArrayList<Integer>();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 毫秒
----------------------------------------------------------------------------------------
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> (1)
- 内功心法 -- java.util.ArrayList<E> (1)
- 内功心法 -- java.util.ArrayList<E> (1)
- java.util.ArrayList<E>
- java数据结构:ConcurrentSkipListSet<E>与CopyOnWriteArraySet<E>
- java如何将ArrayList<T>写入(读出…
- 1. java.util.List 与 2.java.util.ArrayList<E>
- IOS学习内功心法-初学者1
- 话说Collection<E>接口
- Thinking In Java<<Java编程思想>>
- java>>> >> <<操作符解释
- Java 运算符 &与&& << >> >>>区别
- Java 运算符 &与&& << >> >>>区别
- 你的类中有几个方法?——40岁偷练java之内功心法(1)
- 5-1、java.util.ArrayList
- java.util.ArrayList.add(int index, E elemen)方法实例
- 「Java基础教程」java基础学习内功心法
- iOS - 图片拉伸
- 今日小结
- 给价格加.00
- Java学习笔记--类和对象
- go语言快速入门:使用静态文件(20)
- 内功心法 -- java.util.ArrayList<E> (1)
- Hibernate 一对一外键双向关联
- 国密SKF接口函数介绍之三:应用管理函数
- 搜索框智能提示ajax
- kafka增加topic 的partitions数量
- Java 实例说明 &&和&的区别
- java.lang.ClassCastException: oracle.sql.CLOB cannot be cast to oracle.sql.CLOB
- Lambda表达式
- MySQL数据库多表查询