在List集合中ArratList最为常用
特点:
- 数组队列,下标从0开始,提供添加,删除修改遍历等功能。
- 实现RandomAccess接口,就是随机访问。通过元素的序列号快速获取元素对象,效率最快
- 实现Cloneable接口,就有clone()函数,能被克隆
- 不是线程安全的,限单线程使用。多线程用Vector(待续)
属性: - 各种函数就不一一列举,在eclipse中定义一个ArrayList出来,使用你的对象时打个点(.)不就知道它有什么方法了吗?(add,remove,clear,set)
- elementData动态数组是一个object类型的,毕竟ArratList可以存任何类型(不能是基础类型至少是封装类型)是吧。初始化的时候就像初始化数组一样,一般会有一个数组大小。如果没有设置,默认是10。如果添加的时候超过了这个值,新的容量会变为=(原始容量*3)/2+1
- size(),就是返回数组的实际大小,有多少个实际存在的值就返回多少
3种遍历ArrayList(比较时间):迭代器,Randomaccess,普通遍历
package ali_ArrayListTest.sty;
import java.awt.List;
import java.util.*;
import java.util.concurrent.*;
public class MyTest {
// 用迭代器来遍历
public static void useIterator(ArrayList<Integer> list){
Iterator iterator = list.iterator();//必须先实现这个接口才能使用迭代器里面的方法
long firsttime = System.currentTimeMillis();//遍历前时间
while(iterator.hasNext()){
iterator.next();
}
long lasttime = System.currentTimeMillis();
System.out.println("Iterator used: "+(lasttime-firsttime)+" times");
}
// 使用随机访问来遍历
public static void useRandomAccess(ArrayList<Integer> list){
long firsttime = System.currentTimeMillis();
for(int i=0;i<list.size();i++){
list.get(i);//就像是通过数组的索引来获取值的,(其中是基于二分法查找,肯定比一个一个找快啊)注意是get()方法
}
long lasttime = System.currentTimeMillis();
System.out.println("RandomAccess used: "+(lasttime-firsttime)+" times");
}
// 使用普通for循环来遍历
public static void usePlainFor(ArrayList<Integer> list){
long firsttime = System.currentTimeMillis();
for(Integer temp:list){
;//传统的遍历,相当于顺序查找
}
long lasttime = System.currentTimeMillis();
System.out.println("PlainFor used: "+(lasttime-firsttime)+" times");
}
public static void main(String[] args) {
// TODO Auto-generated method stub
ArrayList<Integer> list = new ArrayList();
for(int i=0;i<100000;i++){
list.add(i);
}
System.out.println("比较三种遍历的不同");
useIterator(list);
useRandomAccess(list);
usePlainFor(list);
}
}
所以,可以看出RandomAccess(随机访问)速率是最快的,RandomAccess和普通遍历实际上差不多但都会比RandomAccess慢。
注意:但这并不意味着就不用迭代器了。不然还实现这个接口干嘛。对不不同的场合,如果你的集合是用的ArrayLinked(内部是双向链表),那么你是用迭代器就比你用for快了,这里不再做演示,,所以当我们拿到一个List的时候(不知道内部有没有实现RandomAccess或者一些其他的接口),应该先判断它有没有实现RandomAccess或者一些其他的接口:
方法:
private static void isRandomAccessSupported(List list) {
if (list instanceof RandomAccess) {//判断是否实现了对应的接口
System.out.println("RandomAccess implemented!");
} else {
System.out.println("RandomAccess not implemented!");
}
}