图1 . ArrayList在Java集合框架中的位置
数组线性表类(ArrayList)和链表类(LinkedList)是实现List的两个链表类,ArrayList是基于数组的,也就是说它用数组来存储元素,而且这个数组是动态创建的。
想象一下,我们用数组来存储一个日常事务清单时该怎么做呢?我们必须在创建数组时定义数组的长度,然后将日常事务一件件存储进去。假设我们定义了一个5个项目的事务清单(数组A长度为5),这时候我们想要再添加一项怎么做呢?1、我们可以定义一个长度为6的数组B,然后把A中的项目全都赋值到B中,然后再在末尾添加一项。2、我们也可以事先定义一个长度为100的数组,那么对于小于100条记录来说,这个数组就是动态的了
ArrayList正是基于第二种方法的。如果元素个数超过了数组的容量,就创建一个新数组,并把所有元素都复制到新数组里面,显而易见,这种方法效率较低。
ArrayList两个显而易见的缺点:
- 使用ArrayList的实例比使用数组的效率低。
- ArrayList的实例只可以存储对象,它不能包含基本类型,例如int,double,char.(实际使用时,用Double代替double,用Integer代替int)
ArrayList类
这个类实际上是这样的
public class ArrayList<E> extends AbstractList<E> implements List<E>, RandomAccess, Cloneable, Serializable
- ArrayList类的一些方法
//构造方法
ArrayList<E>() //以指定的E基类型创建一个空列表,长度为默认长度10
ArrayList<E>(int initialCapacity) //以制定的E基类型和初始容量创建一个空列表
//方法
public boolean add(E element)
//将指定元素添加到序列尾部,序列的长度增加1,如果需要的话,序列的容量将增加,如果添加成功,则返回true
public void add(int index,E element)
//将指定元素添加到指定下标位置,后继元素下标加一,如果需要的话,序列的容量将增加,如果index<0或者index>size(),将跑出IndexOutOfBoundsException异常
public E get(int index)
//取得序列号为index的元素,如果index<0或者index>=size(),则抛出IndexOutOfBoundsException
public E set(int index,E element)
//用给定元素代替index指定的元素,返回被代替的元素,如果index<0或者index>=size(),则抛出IndexOutOfBoundsException
public E remove(int index)
//移除并返回index指定的元素,后继位置下边减1。如果index<0或者index>=size(),则抛出IndexOutOfBoundsException
public int size() //返回元素的个数
public void clear() //清除序列中的所有元素
public boolean contains(Object element) //查询序列中是否存在元素element,如果存在返回true
public int indexOf(Object element) //返回序列中第一次出现element时的序号
public boolean isEmpty() //返回序列是否为空
2. 创建一个ArrayList对象
package edu.hhu.geometry;
import java.util.ArrayList;
import java.util.Scanner;
public class ArrayListDemo {
public static void main(String[] args) {
ArrayList<String> arr = new ArrayList<String>();
System.out.println("Enter item for the list");
boolean done = false;
Scanner keyS = new Scanner(System.in);
while (!done) {
System.out.println("please entry:");
String entry = keyS.nextLine();
arr.add(entry);
System.out.println("any more list?");
String ans = keyS.nextLine();
if(!ans.equalsIgnoreCase("yes"))
{
done = true;
}
}
System.out.println(arr.size());
//以下二种遍历方法选其一
/*for(int i = 0;i<arr.size();i++)
{
System.out.println("No:"+i+","+arr.get(i));
}*/
for(String eString:arr)
{
System.out.println(eString);
}
}
}
下一节将自己动手创建一个动态数组MyArrayList,以加深对ArrayList的理解