Java中 ArrayList、Vector和LinkedList 的使用和详解(转)

import java.util.*;

/**
* (1)ArrayList是最常用的List实现类,内部是通过数组实现的,它允许对元素进行快速随机访问。数组的缺点是每个元素之间不能含有“空隙”。
* 当数组大小不满足时会增加存储能力,将已有数组数据复制到新的存储空间中。当从ArrayList的中间位置插入或者删除元素时,需要对数组进行拷贝,移动,代价比较高。因此,它适合随即查找和遍历,不适合插入合删除。
* (2)Vector与ArrayList一样,也是通过数组实现的。不同的是它支持线程的同步,
* 即一时刻只有一个线程能够写Vector,避免多线程同时写引起的不一致性。但实现同步需要很高的花费, 因此,访问它比访问ArrayList慢。
* (3)LinkedList是用链表结构存储数据的,很适合数据的动态插入和删除,随即访问和遍历速度比较慢。另外,它还提供了List没有定义的方法,专门用于操作表头和表尾元素,可以当作堆栈、队列和双向队列使用。
* (4)因为ArrayList和Vector都是用数组实现的,所以,在添加和插入时,最好从表尾操作,而不要从中间或者表头开始,以避免数组移动引起的开销!
* (5)可以为每个List生成ListIterator,支持双向遍历List,而且能够在ListIterator位置插入和删除元素。
* (6)堆栈类继承Vector,它总是对列表的尾部数据进行操作,采用了先进后出的策略,自定义了插入、查看和弹出元素三个方法。 ArrayList 性能测试。
*
* @author sun
*/
public class TestList {

/** 
 * 初始化一个List 
 *  
 * @param list 
 */  
public static void init(List list) {  
    if (list != null) {  
        list.add("aaa");  
        list.add("ccc");  
        list.add("bbb");  
        list.add("eee");  
        list.add("ddd");  
    }  
}  

/** 
 * 输出List的内容 
 *  
 * @param list 
 */  
public static void output(List list) {  
    if (list != null) {  
        // 根据列表下标遍历,使用list.size()获取列表中元素的个数  
        for (int i = 0; i < list.size(); i++) {  
            System.out.print(list.get(i) + "  ");  
        }  
        System.out.println();  
        // 或者用迭代器遍历  
        Iterator it = list.iterator();  
        Object value = null;  
        while (it.hasNext()) {  
            value = it.next();  
            System.out.print(value + "  ");  
        }  
    }  
    System.out.println();  
}  

/** 
 * 使用ArrayList 
 */  
public static void testArrayList() {  
    List list = new ArrayList();  
    init(list);  
    System.out.println("使用ArrayList: ");  
    output(list);  
}  

/** 
 * 使用Vector 
 */  
public static void testVector() {  
    List list = new Vector();  
    init(list);  
    System.out.println("使用Vector: ");  
    output(list);  
}  

/** 
 * 使用LinkedList 
 */  
public static void testLinkedList() {  
    List list = new LinkedList();  
    init(list);  
    System.out.println("使用LinkedList: ");  
    output(list);  
}  

public static void main(String[] args) {  
    TestList.testArrayList();  
    // TestList.testVector();  
    // TestList.testLinkedList();  

    List list = new ArrayList();  
    init(list);  
    // 1:List支持元素重复  
    list.add("aaa");  
    list.add("bbb");  
    System.out.println("插入元素aaa, bbb后:");  
    output(list);  
    // 2:指定元素插入的位置  
    list.add(1, "fff");  
    System.out.println("在下标为1处插入fff后:");  
    output(list);  
    List list2 = new ArrayList();  
    list2.add("ggg");  
    list2.add("hhh");  
    // 将另一列表中的元素插入到列表中  
    list.addAll(list2);  
    System.out.println("添加list2的元素后:");  
    output(list);  

    // 判断列表是否包含某一元素  
    // 通过元素的equals方法,判断元素是否相等  
    System.out.println("list包含aaa? " + list.contains("aaa"));  
    // 判断列表中是否包含了另外一个列表中的所有元素。  
    System.out.println("list包含list2中的所有元素? " + list.containsAll(list2));  
    // 定位一个元素在列表中最先出现的位置  
    System.out.println("aaa在list中第一次出现的位置: " + list.indexOf("aaa"));  
    // 定位一个元素在列表中最后出现的位置  
    System.out.println("aaa在list中最后一次出现的位置: " + list.lastIndexOf("aaa"));  

    // 更新列表中某个位置的元素值  
    list.set(2, "xxx");  
    System.out.println("更新位置为2的元素为xxx后:");  
    output(list);  
    // 删除列表中的某个元素,只删除第一次出现的那个  
    list.remove("aaa");  
    System.out.println("删除元素aaa后:");  
    output(list);  
    // 删除列表中指定位置的元素  
    list.remove(1);  
    System.out.println("删除下标为1的元素后:");  
    output(list);  
    // 删除列表中的其他元素,只保留另一个列表中包含的元素  
    list.retainAll(list2);  
    System.out.println("删除除list2包含的以外的元素后:");  
    output(list);  
    // 删除列表中在另一列表中也包含了的元素  
    list.removeAll(list2);  
    System.out.println("删除list2包含的元素后:");  
    output(list);  
    // 清空列表  
    list.clear();  
    // 判断列表中是否有数据  
    System.out.println("清空List后,list为空么?  " + list.isEmpty());  
    /* 
     * --------------------- 
     */  
    init(list);  
    // 用列表中的某些元素构造一个新的列表  
    list2 = list.subList(1, 3);  
    System.out.println("用list的第1个到第3个元素构造一个新的List:");  
    output(list2);  

    // 用List特有的遍历器ListIterator遍历列表  
    // 与普通的Iterator不用,它允许两个方向遍历列表  
    ListIterator listIt = list.listIterator();  
    System.out.println("正向遍历列表");  
    while (listIt.hasNext()) {  
        System.out.print(listIt.next() + "  ");  
    }  
    System.out.println();  
    System.out.println("反向遍历列表");  
    while (listIt.hasPrevious()) {  
        System.out.print(listIt.previous() + "  ");  
    }  
    System.out.println();  
    // 也可以使用ListIterator从List中间插入和删除元素,  
    // 只能在遍历器当前位置添加和删除。  
    listIt.add("newadd");  
    System.out.println("用ListIterator往列表中添加元素newadd后: ");  
    output(list);  
    listIt.next();  
    listIt.remove();  
    System.out.println("用ListIterator删除列表中元素后: ");  
    output(list);  

    // LinkedList自定义的方法  
    LinkedList linklist = new LinkedList();  
    init(linklist);  
    // 添加元素到列表头  
    linklist.addFirst("fff");  
    System.out.println("把fff放到列表头:");  
    output(linklist);  
    // 添加元素到列表尾  
    linklist.addLast("eee");  
    System.out.println("把eee放到列表尾:");  
    output(linklist);  
    // 获取表头元素  
    System.out.println("列表头元素:" + linklist.getFirst());  
    // 获取表尾元素  
    System.out.println("列表尾元素:" + linklist.getLast());  
    // 删除列表头的元素  
    linklist.removeFirst();  
    System.out.println("删除列表头元素:");  
    output(linklist);  
    // 删除列表尾的元素  
    linklist.removeLast();  
    System.out.println("删除列表尾元素:");  
    output(linklist);  

    // 堆栈Stack类,它继承自Stack类  
    Stack myStack = new Stack();  
    // 插入元素,是插入到尾部  
    myStack.push("aaa");  
    myStack.push("bbb");  
    myStack.push("ccc");  
    myStack.push("ddd");  
    myStack.push("eee");  
    myStack.push("fff");  
    myStack.push("ggg");  
    System.out.println("堆栈中的元素是: ");  
    output(myStack);  
    /* 查看堆栈顶部的对象,但不从堆栈中移除它。 */  
    System.out.println("堆栈尾部元素: " + myStack.peek());  
    /* 移除堆栈顶部的对象,并返回该对象作为此函数的值。 */  
    System.out.println("弹出堆栈尾部元素: " + myStack.pop());  
    System.out.println("再次弹出堆栈尾部元素: " + myStack.peek());  
    /* 把项压入堆栈顶部。 */  
    myStack.push("sun");  
    System.out.println("再一次弹出堆栈尾部元素: " + myStack.peek());  
    if (myStack.empty()) {  
        System.out.println("myStack为空!");  
    } else {  
        System.out.println("myStack不为空!");  
    }  
    /* 对象到堆栈顶部的位置,以 1 为基数;返回值 -1 表示此对象不在堆栈中。 */  
    System.out.println("返回对象在堆栈中的位置: " + myStack.search("fff"));  

}  

}
来源: http://blog.csdn.net/kevon_sun/article/details/7936329

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章