本文通过实例讲解Java中如何使用ArrayList类。
Java.util.ArrayList类是一个动态数组类型,也就是说,ArrayList对象既有数组的特征,也有链表的特征。可以随时从链表中添加或删除一个元素。ArrayList实现了List接口。
大家知道,数组是静态的,数组被初始化之后,数组长度就不能再改变了。ArrayList是可以动态改变大小的。那么,什么时候使用Array(数组),什么时候使用ArrayList?答案是:当我们不知道到底有多少个数据元素的时候,就可使用ArrayList;如果知道数据集合有多少个元素,就用数组。
1.ArrayList构造函数
ArrayList类支持3个构造方法。
Arraylist()
这个构造方法构造了一个空的链表。
ArrayList(Collection<? extends E> c)
这个构造方法构造了一个包含指定元素集合的链表,注意,这里的字符E是一个标记,用来表示集合中元素的类型。至于具体是什么类型,需要你在使用这个构造方法的时候来指定。
ArrayList(int initialCapacity)
这是第三个构造方法,构造了一个指定大小但内容为空的链表。initialCapacity参数就是初始容量大小。
举例来说,如果你要创建一个空的数组链表,用来存放String类型的对象,那么你可以像下面这样做:
ArrayList<String> list = new ArrayList<String>();
如果你需要创建一个指定初始容量的数组链表,你可以像下面这样做:
ArrayList<Integer> list = new ArrayList<Integer>(7);
注意:ArrayList类只支持对象类型,不支持 基础数据类型。就是说ArrayList对象只能存放对象,不能存放基础数据类型的数据。
2.ArrayList常用方法
下面是总结了一些比较常用的ArrayList类成员方法:
- 增加元素到链表中
boolean add(Element e)
增加指定元素到链表尾部.
void add(int index, Element e)
增加指定元素到链表指定位置.
- 从链表中删除元素
void clear()
从链表中删除所有元素.
E remove(int index)
删除链表中指定位置的元素.
protected void removeRange(int start, int end)
删除链表中从某一个位置开始到某一个位置结束的元素。
- 获取链表中的元素
E get(int index)
获取链表中指定位置处的元素.
Object[] toArray()
获取一个数组,数组中所有元素是链表中的元素.(即将链表转换为一个数组)
- 修改某个元素
E set(int index, E element)
将链表中指定位置上的元素替换成新元素。
- 搜索元素
boolean contains(Object o)
如果链表包含指定元素,返回true.
int indexOf(Object o)
返回元素在链表中第一次出现的位置,如果返回-1,表示链表中没有这个元素。
int lastIndexOf(Object o)
返回元素在链表中最后一次出现的位置,如果返回-1,表示链表中没有这个元素。
- 检查链表是否为空
boolean isEmpty()
返回true表示链表中没有任何元素.
- 获取链表大小
int size()
返回链表长度(链表包含元素的个数).
以上是ArrayList类中使用比较多的成员方法。每个方法的更详细的说明或其它没有提及到的方法,读者可以参考java官方api
3.ArrayList使用实例
package www;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
public class ArrayListTest {
public static void main(String[] args) {
//三种构造方法
/**
* 创建一个集合时,集合的初始容量为0,在第一次添加元素的时候,会对集合进行扩容,扩容之后,集合容量为10;
* 之后,当向集合中添加元素达到集合的上限(也就是minCapacity大于elementData.length)时,会对集合再次扩容,扩容为原来的3/2。
*/
List<String> list1 = new ArrayList();
List<String> list2 = new ArrayList<String>();
ArrayList<String> list3 = new ArrayList<String>(2);//指定初始容量为2
//添加元素到list3
list3.add("one");
list3.add("two");
list3.add(2, "three");
list3.add(3,"four");
list3.add("two");
list3.add("two1");
//显示所有内容
System.out.println(list3);
//删除指定位置的元素
list3.remove(4);
//显示所有内容
System.out.println(list3);
//删除第一个找到的“two1”元素
list3.remove("two1");
//显示所有内容
System.out.println(list3);
//替换“one”为“one1”
list3.set(0, "one1");
//显示所有内容
System.out.println(list3);
//检查元素位置(-1表示不存在)
int pos = list3.indexOf("four");
int pos1 = list3.indexOf("five");
System.out.println("four这个元素的位置为:" + pos + ",five这个元素的位置为:" + pos1);
//检查数组链表是否为空
boolean check = list3.isEmpty();
System.out.println("数组链表是否为空:" + check);
//获取list3的大小
int size = list3.size();
System.out.println("list3的大小:" + size);
//检查list3中是否包含某元素
boolean element = list3.contains("four");
boolean element1 = list3.contains("five");
System.out.println("list3中是否包含four:" + element + ",list3中是否包含five:" + element1);
//获取指定位置上的元素
String item = list3.get(0);
System.out.println("位置0上的元素:" + item);
//遍历操作,三种方法 效率由高到低:索引>foreach>Iterator
//方法一:循环使用元素的索引和链表的大小
for(int i = 0;i<list3.size();i++) {
System.out.println("list["+i +"]=" + list3.get(i));
}
//方法二:使用foreach循环
for(String str : list3) {
System.out.println(str);
}
//方法三:使用迭代器 hasNext();返回true表示还有下一个元素 next();返回下一个元素
Iterator<String> iterator = list3.iterator();
while(iterator.hasNext()) {
System.out.println(iterator.next());
}
//转换为数组 toArray()方法
// 第一种方式(最常用)
String[] string = list3.toArray(new String[0]);
// 第二种方式(容易理解)
String[] string1 = new String[list3.size()];
list3.toArray(string1);
}
}