从Java集合框架之Collection接口中我们知道List接口有3个实现子类,分别为ArrayList、LinedList与Vector类,而我们编程中最常用到的集合为ArrayList,这篇主要介绍ArrayList类。
我们知道数组可以用来存放基础数据类型与引用类型,在定义的时候,存放在数组中的类型是已经确定的了,如下面给定的数组只能用来存放String类型的值,并且这时数组的长度已经固定
String[] array = new String[5];
如果想给数组添加新的值,比如说像这样
array[6] = "s";
则会报java.lang.IndexOutOfBoundsException的错误,即数组越界,如果想在原来数组的元素中间添加新的元素,那数组也是无能为力的,为了弥补数组这种不可变的行为,Java中设计了一系列操作元素的集合类,比如这篇文章要讲的ArrayList类。
java.lang.Object java.util.AbstractCollection<E> java.util.AbstractList<E> java.util.ArrayList<E>
所有已实现的接口: Serializable, Cloneable, Iterable<E>, Collection<E>, List<E>, RandomAccess 直接已知子类: AttributeList, RoleList, RoleUnresolvedList
ArrayList继承了AbstractList,实现了List接口,是一个数组队列,提供了添加、删除、修改、遍历等功能,相当于是一个动态数组,与数组的固定容量相比较,ArrayList集合的容量可以根据一定的规则动态的增长,对于事先不知道元素的类型以及数量时,考虑用ArrayList比较适合。
ArrayList实现了RandmoAccess接口,即提供了随机访问功能。在ArrayList中,我们可以通过元素的序号快速获取元素对象,这就是快速随机访问。
ArrayList实现了Cloneable接口,即覆盖了函数clone(),能被克隆。
ArrayList实现java.io.Serializable接口,这意味着ArrayList支持序列化,能通过序列化去传输。
ArrayList() 构造一个初始容量为 10 的空列表。 ArrayList(Collection<? extends E> c) 构造一个包含指定 collection 的元素的列表,这些元素是按照该 collection 的迭代器返回它们的顺序排列的。 ArrayList(int initialCapacity) 构造一个具有指定初始容量的空列表。
实现自Collection接口中的方法
boolean add(E e) 确保此 collection 包含指定的元素(可选操作)。 boolean addAll(Collection<? extends E> c) 将指定 collection 中的所有元素都添加到此 collection 中(可选操作)。 void clear() 移除此 collection 中的所有元素(可选操作)。 boolean contains(Object o) 如果此 collection 包含指定的元素,则返回 true。 boolean containsAll(Collection<?> c) 如果此 collection 包含指定 collection 中的所有元素,则返回 true。 boolean equals(Object o) 比较此 collection 与指定对象是否相等。 int hashCode() 返回此 collection 的哈希码值。 boolean isEmpty() 如果此 collection 不包含元素,则返回 true。 Iterator<E> iterator() 返回在此 collection 的元素上进行迭代的迭代器。 boolean remove(Object o) 从此 collection 中移除指定元素的单个实例,如果存在的话(可选操作)。 boolean removeAll(Collection<?> c) 移除此 collection 中那些也包含在指定 collection 中的所有元素(可选操作)。 boolean retainAll(Collection<?> c) 仅保留此 collection 中那些也包含在指定 collection 的元素(可选操作)。 int size() 返回此 collection 中的元素数。 Object[] toArray() 返回包含此 collection 中所有元素的数组。 <T> T[] toArray(T[] a) 返回包含此 collection 中所有元素的数组;返回数组的运行时类型与指定数组的运行时类型相同。
实现自List接口中的方法,几乎都是与位置有关的方法
void add(int index, E element) 在列表的指定位置插入指定元素(可选操作)。 boolean addAll(int index, Collection<? extends E> c) 将指定 collection 中的所有元素都插入到列表中的指定位置(可选操作)。 E get(int index) 返回列表中指定位置的元素。 int hashCode() 返回列表的哈希码值。 int indexOf(Object o) 返回此列表中第一次出现的指定元素的索引;如果此列表不包含该元素,则返回 -1。 int lastIndexOf(Object o) 返回此列表中最后出现的指定元素的索引;如果列表不包含此元素,则返回 -1。 ListIterator<E> listIterator() 返回此列表元素的列表迭代器(按适当顺序)。 ListIterator<E> listIterator(int index) 返回列表中元素的列表迭代器(按适当顺序),从列表的指定位置开始。 E remove(int index) 移除列表中指定位置的元素(可选操作)。 E set(int index, E element) 用指定元素替换列表中指定位置的元素(可选操作)。 List<E> subList(int fromIndex, int toIndex) 返回列表中指定的 fromIndex(包括 )和 toIndex(不包括)之间的部分视图。
ArrayList自己特有的方法
Object clone() 返回此 ArrayList 实例的浅表副本。 void ensureCapacity(int minCapacity) 如有必要,增加此 ArrayList 实例的容量,以确保它至少能够容纳最小容量参数所指定的元素数。 protected void removeRange(int fromIndex, int toIndex) 移除列表中索引在 fromIndex(包括)和 toIndex(不包括)之间的所有元素。 void trimToSize() 将此 ArrayList 实例的容量调整为列表的当前大小。
后续
1 package list; 2 3 import java.util.ArrayList; 4 import java.util.Iterator; 5 import java.util.List; 6 7 public class ListDemo1 { 8 public static void main(String[] args) { 9 List list = new ArrayList(); 10 list.add("红楼梦"); 11 list.add("三国演义"); 12 list.add("西游记"); 13 list.add("水浒传"); 14 15 Object object = null; 16 Iterator it = list.iterator(); 17 18 while (it.hasNext()) { 19 object = it.next(); 20 System.out.println(object); 21 } 22 } 23 }
输出结果
红楼梦
三国演义
西游记
水浒传
除了用Iterator接口中的iterator方法遍历外,还可以使用ArrayList集合特有的接口ListIterator来遍历
ListIterator<E> listIterator()
返回列表中元素的列表迭代器(以正确的顺序)。
ListIterator继承自Iterator接口,除了拥有Iterator接口中的方法之外,还拥有自己特有的遍历方法
boolean hasPrevious() 如果以反向遍历列表,列表迭代器有多个元素,则返回 true。 E previous() 返回列表中的前一个元素。
虽然ListIterator可以实现集合的逆向迭代,但是从Java集合框架之Collection接口中我们知道,迭代器初始状态下前面并没有任何元素,必须先正向遍历,才能逆向遍历,所以一般不使用逆向迭代。
1 package list; 2 3 import java.util.ArrayList; 4 import java.util.List; 5 import java.util.ListIterator; 6 7 public class ListDemo2 { 8 public static void main(String[] args) { 9 List list = new ArrayList(); 10 list.add("红楼梦"); 11 list.add("三国演义"); 12 list.add("西游记"); 13 list.add("水浒传"); 14 15 Object object = null; 16 ListIterator it = list.listIterator(); 17 18 System.out.println("----------逆向迭代----------"); 19 while (it.hasPrevious()) { 20 object = it.previous(); 21 System.out.println(object); 22 } 23 24 System.out.println("----------正向迭代----------"); 25 while (it.hasNext()) { 26 object = it.next(); 27 System.out.println(object); 28 } 29 30 System.out.println("----------逆向迭代----------"); 31 while (it.hasPrevious()) { 32 object = it.previous(); 33 System.out.println(object); 34 } 35 } 36 }
输出结果
----------逆向迭代---------- ----------正向迭代---------- 红楼梦 三国演义 西游记 水浒传 ----------逆向迭代---------- 水浒传 西游记 三国演义 红楼梦
从上面结果可以看出,当第一次逆向迭代的时候并没有任何输出,当正向迭代后,迭代器到了集合的末尾之后,再次逆向迭代,这时才有输出。
上面的while循环,我们可以改成for循环
1 package list; 2 3 import java.util.ArrayList; 4 import java.util.Iterator; 5 import java.util.List; 6 7 public class ListDemo3 { 8 public static void main(String[] args) { 9 List list = new ArrayList(); 10 list.add("红楼梦"); 11 list.add("三国演义"); 12 list.add("西游记"); 13 list.add("水浒传"); 14 15 Object object = null; 16 17 for (Iterator iterator = list.iterator(); iterator.hasNext();) { 18 object = iterator.next(); 19 System.out.println(object); 20 } 21 } 22 }
1 package list; 2 3 import java.util.ArrayList; 4 import java.util.List; 5 6 public class ListDemo4 { 7 public static void main(String[] args) { 8 List list = new ArrayList(); 9 list.add("红楼梦"); 10 list.add("三国演义"); 11 list.add("西游记"); 12 list.add("水浒传"); 13 14 Object object = null; 15 16 for (int i = 0; i < list.size(); i++) { 17 object = list.get(i); 18 System.out.println(object); 19 } 20 } 21 }
1 package list; 2 3 import java.util.ArrayList; 4 import java.util.List; 5 6 public class ListDemo5 { 7 public static void main(String[] args) { 8 List list = new ArrayList(); 9 list.add("红楼梦"); 10 list.add("三国演义"); 11 list.add("西游记"); 12 list.add("水浒传"); 13 14 for (Object object : list) { 15 System.out.println(object); 16 } 17 } 18 }
1 package list; 2 3 import java.util.ArrayList; 4 import java.util.List; 5 6 public class ListDemo6 { 7 public static void main(String[] args) { 8 List list = new ArrayList(); 9 10 // 添加元素 11 list.add("红楼梦"); 12 list.add("三国演义"); 13 list.add("西游记"); 14 list.add("水浒传"); 15 16 // 获取集合大小 17 System.out.println("初始状态:" + list); 18 System.out.println("数组大小:" + list.size()); 19 20 // 判断集合是否包含某元素 21 boolean contain = list.contains("水浒传"); 22 System.out.println("集合是否包含水浒传: " + contain); 23 24 // 判断集合是否为空 25 boolean isEmpty = list.isEmpty(); 26 System.out.println("集合是否为空:" + isEmpty); 27 28 // 获取第一个元素 29 Object object = list.get(0); 30 System.out.println("第一个元素是: " + object); 31 32 // 获取第一次出现给定元素的位置 33 int index = list.indexOf("水浒传"); 34 System.out.println("第一次出现水浒传的位置是:" + index); 35 36 // 在1位置插入元素,插入的位置不能超过集合的最大长度,否则报java.lang.IndexOutOfBoundsException异常 37 list.add(2, "平凡的世界"); 38 System.out.println("在位置2处插入元素后的集合: " + list); 39 40 // 删除刚才插入的元素 41 object = list.remove(2); 42 System.out.println("被删除的元素: " + object); 43 System.out.println("删除元素后的集合: " + list); 44 45 // 替换指定位置的元素 46 object = list.set(0, "儒林外史"); 47 System.out.println("被替换的元素是:" + object); 48 49 System.out.println("现在集合中的元素是:" + list); 50 51 // 集合转数组 52 Object[] objects = list.toArray(); 53 for (int i = 0; i < objects.length; i++) { 54 System.out.println("第" + i + "元素:" + objects[i]); 55 } 56 57 // 清空集合 58 list.clear(); 59 System.out.println("清空集合后:" + list); 60 System.out.println("清空集合是否为空:" + list.isEmpty()); 61 } 62 }
输出结果
初始状态:[红楼梦, 三国演义, 西游记, 水浒传] 数组大小:4 集合是否包含水浒传: true 集合是否为空:false 第一个元素是: 红楼梦 第一次出现水浒传的位置是:3 在位置2处插入元素后的集合: [红楼梦, 三国演义, 平凡的世界, 西游记, 水浒传] 被删除的元素: 平凡的世界 删除元素后的集合: [红楼梦, 三国演义, 西游记, 水浒传] 被替换的元素是:红楼梦 现在集合中的元素是:[儒林外史, 三国演义, 西游记, 水浒传] 第0元素:儒林外史 第1元素:三国演义 第2元素:西游记 第3元素:水浒传 清空集合后:[] 清空集合是否为空:true
原文:http://www.cnblogs.com/huangminwen/p/6295062.html