①ArrayList:内部采用数组存储元素,支持高效随机访问,支持动态调整大小;更适合遍历查询,增删改查的效率相对低;
②LinkedList:内部采用链表来存储元素,支持快速插入/删除元素,但不支持高效地随机访问;更适合增删改,遍历效率相对低[无同步];
③Vector:采用数组存储元素,使用了synchronized方法,是一个线程安全的容器,所以性能上比ArrayList差[同步];
ArrayList | LinkedList | Vector | |
默认初始容量 | 10 | 10 | |
扩容机制 | 之前的1.5倍 | 之前的2倍 | |
底层存储方式 | 数组 | 双向链表 | 数组 |
线程 | 不安全 | 不安全 | 安全[synchronized方法] |
特点 | 查询快,增删慢 | 查询慢,增删改快 |
Collection接口是最基本的集合接口,一个Collection代表一组Object,即Collection的元素(elements);
由Collection接口派生的两个接口是List和Set;
延伸:
面试题:去除[1,100000]之间的偶数
public class testList {
public static void main(String[] args) {
//====================去除[1,100000]之间的偶数========================
arrayRemove();
arrayAdd();
linkedremove();
}
//准备一个ArrayList
private static ArrayList<Integer> preList() {
ArrayList<Integer> arrayList = new ArrayList<Integer>(100001);
for (int i = 1; i < 100001; i++) {
arrayList.add(i);
}
return arrayList;
}
//①ArrayList+迭代器+if+remove
public static void arrayRemove() {
ArrayList<Integer> arrayList = preList();
Long start = System.currentTimeMillis();
Iterator<Integer> iterator = arrayList.iterator();
while (iterator.hasNext()) {
Integer next = iterator.next();
if (next % 2 == 0) {
iterator.remove();
}
}
Long end = System.currentTimeMillis();
System.out.println("普通删除消耗时间:" + (end - start));
}
//②ArrayList*2+迭代器+if+add
public static void arrayAdd() {
ArrayList<Integer> arrayList1=new ArrayList<Integer>();
List<Integer> arrayList=preList();
Long start=System.currentTimeMillis();
Iterator<Integer> iterator=arrayList.iterator();
while(iterator.hasNext()){
Integer i=iterator.next();
if(i%2!=0){
arrayList1.add(new Integer(i));
}
}
Long end=System.currentTimeMillis();
System.out.println("第二种方法时间"+(end-start));
}
public static void linkedremove(){
LinkedList<Integer> linkedList=new LinkedList<Integer>();
for(int i=1;i<100001;i++){
linkedList.add(new Integer(i));
}
Long start=System.currentTimeMillis();
Iterator<Integer> iterator=linkedList.iterator();
while(iterator.hasNext()){
Integer i=iterator.next();
if(i%2==0){
iterator.remove();
}
}
Long end=System.currentTimeMillis();
System.out.println("linked删除消耗时间"+(end-start));
}
}
普通删除消耗时间:830
第二种方法时间:32
linked删除消耗时间:16
检索、插入、删除对象的效率:
ArrayList和Vector中,从指定的位置(用index)检索一个对象,或在集合的末尾插入、删除一个对象的时间是一样的,可表示为O(1)。但是,如果在集合的其他位置增加或移除元素那么花费的时间会呈线形增长:O(n-i),其中n代表集合中元素的个数,i代表元素增加或移除元素的索引位置。为什么会这样呢?以为在进行上述操作的时候集合中第i和第i个元素之后的所有元素都要执行(n-i)个对象的位移操作。
LinkedList中,在插入、删除集合中任何位置的元素所花费的时间都是一样的—O(1),但它在索引一个元素的时候比较慢,为O(i),其中i是索引的位置。所以,如果只是查找特定位置的元素或只在集合的末端增加、移除元素,那么使用Vector或ArrayList都可以。如果是对其它指定位置的插入、删除操作,最好选择LinkedList。