1. 程式人生 > >南哥帶你玩轉 Java 之 Java 集合--list

南哥帶你玩轉 Java 之 Java 集合--list

list

List 介面
List介面是一個有序的 Collection,使用此介面能夠精確的控制每個元素插入的位置,能夠通過索引
(元素在List中位置,類似於陣列的下標)來訪問List中的元素,第一個元素的索引為 0,而且允許有相同的元素。
List 介面例項儲存的是有序的,可以重複的元素。
List和陣列類似,可以動態增長,根據實際儲存的資料的長度自動增長List的長度。
查詢元素效率高,插入刪除效率低,因為會引起其他元素位置改變 
<實現類有ArrayList,LinkedList,Vector> 。
ArrayList 和 LinkedList 的區別
ArrayList:
陣列實現 陣列實現特點:查詢快,增刪慢(參照 LinkedList) 查詢:直接使用角標查詢 增刪:需要把要新增的元素的位置,後面的元素全部移動一位 LinkedList:連結串列實現 連結串列實現特點:查詢慢,增刪快 查詢:判斷離頭近還是尾近,然後從頭或尾,一個個查詢,找到為止 增刪:將要插入/移除的元素的地址儲存/刪除,後面的元素不用進行任何操作

陣列查詢和連結串列查詢的區別

陣列查詢和連結串列查詢的區別

思考:
什麼時候使用 ArrayList?
查詢多的時候
什麼時候使用 LinkedList?
增刪多的時候
工作中一般使用什麼呢?
ArrayList
list 介面中常用方法
private static void
demo() { List list = new ArrayList(); list.add("a"); list.add("b"); list.add("c"); list.add("d"); // 使用 list 中的新增方法 add(int index, Object object) // 新增的角標就是後面元素所在的位置,不能越界 list.add(4, "x"); System.out.println(list); // 通過角標獲取對應的元素 Object object = list.get(2); System.
out.println(object); // 通過 get 方法進行遍歷 for (int i = 0; i < list.size(); i++) { System.out.println(list.get(i)); } // set 方法(不要越界) list.set(0, "z"); System.out.println(list); // 根據角標刪除(Object remove = list.remove(3);中 remove 返回的是被刪除的元素, list 剩下沒被刪除的元素) list.remove(3); System.out.println(list); // 注意:刪除方法需要注意的 List list1 = new ArrayList(); list1.add(111);// 進行自動裝箱 list1.add(222); list1.add(333); // 刪除111元素 list1.remove(0);// 第一種方法 // 這裡刪除的時候,系統不會進行自動裝箱,按照角標傳入的方法 // 所以呼叫的是按角標刪除的方法,所以越界 // list.remove(111);// 錯誤方法 // 如果非要使用按元素刪除,需要手動裝箱 list1.remove(Integer.valueOf(111));// 第二種方法 System.out.println(list1); }
發生併發修改異常
private static void demo() {
    List list = new ArrayList();
    list.add("a");
    list.add("b");
    list.add("c");
    list.add("d");
    // 新增完四個元素,這時集合長度為4
    // 使用迭代器遍歷時,長度必須是固定的,不可改變
    // 獲取集合迭代器
    Iterator iterator = list.iterator();
    while (iterator.hasNext()) {
        if (iterator.next().equals("b")) {
            // 發生異常 ConcurrentModificationException(併發修改異常)
            // 注意:在迭代器遍歷的時候,不要直接使用集合做操作
            list.add("oh-yes");// 相當於修改集合長度
            // 如何解決
            // 直接把要新增的元素讓迭代器新增
        }
    }
    System.out.println(list);
}

解決併發修改異常
思路:讓迭代器去完成新增元素
private static void demo() {
    List list = new ArrayList();
    list.add("a");
    list.add("b");
    list.add("c");
    list.add("d");
    // 取出 list 特有的迭代器
    ListIterator listIterator = list.listIterator();
    while(listIterator.hasNext()) {
        if (listIterator.next().equals("b")) {
            // 讓迭代器向集合中新增元素
            listIterator.add("Oh~Yes");
        }
    }
    System.out.println(list);
    // 注意:在迭代器中,進行對集合的新增或刪除,要使用迭代器中的方法,不能直接使用集合去操作
}
public static void demo() {
    List list = new ArrayList();
    list.add("a");
    list.add("b");
    list.add("c");
    list.add("d");
    ListIterator listIterator = list.listIterator();
    // 正向
    while (listIterator.hasNext()) {
        System.out.println(listIterator.next());
    }
    listIterator = list.listIterator(list.size());
    // 逆向
    // hasPrevious 判斷前一個元素有沒有
    while (listIterator.hasPrevious()) {
        // 獲取前一個元素
        System.out.println(listIterator.previous());
    }
}
Vector(使用陣列來實現的,已經被 ArrayList 替代)
private static void fun5() {
    // 建立一個 vector 集合,迭代器遍歷
    Vector vector = new Vector();
    // 新增元素
    vector.addElement("a");
    vector.addElement("b");
    vector.addElement("c");
    vector.addElement("d");
    System.out.println(vector);
    // 迭代器遍歷
    Enumeration elements = vector.elements();
    while (elements.hasMoreElements()) {
        // 輸出元素
        System.out.println(elements.nextElement());
    }
}
LinkedList
private static void fun6() {
    LinkedList linkedList = new LinkedList();
    // 使用 addFirst 方法新增
    // linkedList.addFirst("a");
    // linkedList.addFirst("b");
    // linkedList.addFirst("c");
    // linkedList.addFirst("d");
    // 使用 addLast 方法新增
    linkedList.addLast("a");
    linkedList.addLast("b");
    linkedList.addLast("c");
    linkedList.addLast("d");
    System.out.println(linkedList);
    // 獲取頭尾元素
    System.out.println(linkedList.getFirst());
    System.out.println(linkedList.getLast());
}

佇列和棧

佇列和棧
佇列的特點:先進先出
棧的特點:先進後出
使用 LinkedList 模擬棧結構
private static void fun1() {
    LinkedList linkedList = new LinkedList();
    // 新增元素A,B,C,D模擬進棧
    linkedList.addLast("A");
    linkedList.addLast("B");
    linkedList.addLast("C");
    linkedList.addLast("D");
    System.out.println(linkedList);
    // 模擬出棧
    // 每次刪之前檢視一下這個集合是否為空的
    while (!linkedList.isEmpty()) {
        linkedList.removeLast();
        System.out.println(linkedList);
    }
}
ArrayList 去重
public static void fun2() {
    ArrayList arrayList = new ArrayList();
    arrayList.add("a");
    arrayList.add("a");
    arrayList.add("a");
    arrayList.add("b");
    arrayList.add("b");
    arrayList.add("b");
    arrayList.add("c");
    arrayList.add("c");
    arrayList.add("c");
    System.out.println(arrayList);
    // 建立個新陣列
    ArrayList arrayList1 = new ArrayList();
    // 遍歷原陣列,取出每一個元素,比對是否存在於新陣列中,不存在則放入,存在就放棄
    // 原陣列迭代器
    Iterator iterator = arrayList.iterator();
    while (iterator.hasNext()) {
        // 判斷原陣列中元素是否存在於新陣列中
        // 不存在就新增入新陣列中,否則放棄
        Object next = iterator.next();// 不能呼叫兩次 next() 方法
        if (!arrayList1.contains(next)) {
            // 將元素新增到新陣列中
            arrayList1.add(next);
        }
    }
    System.out.println(arrayList1);
}
去除重複的學生
public static void fun3() {
    ArrayList arrayList = new ArrayList();
    // 六個學生的地址都不一樣,所以不是同一個物件
    arrayList.add(new Student("鵬鵬", 18));
    arrayList.add(new Student("鵬鵬", 18));
    arrayList.add(new Student("水水", 17));
    arrayList.add(new Student("水水", 17));
    arrayList.add(new Student("茜茜", 16));
    arrayList.add(new Student("茜茜", 16));
    Iterator iterator = arrayList.iterator();
    ArrayList arrayList2 = new ArrayList();
    while (iterator.hasNext()) {
        Object next = iterator.next();
        Student student = (Student)next;
        if (!arrayList2.contains(student)) {
            arrayList2.add(student);
        }
    }
    for (Object object : arrayList2) {
        Student student = (Student)object;
        System.out.println(student);
    }
}
public class Student {
    private String name;// 姓名
    private int age;// 年齡
    public Student() {
        super();
    }
    public Student(String name, int age) {
        super();
        this.name = name;
        this.age = age;
    }
    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }
    public int getAge() {
        return age;
    }
    public void setAge(int age) {
        this.age = age;
    }
    @Override
    public String toString() {
        return "[姓名:" + name + ", 年齡:" + age + "]";
    }

    // 重寫 equals 方法
    @Override
    public boolean equals(Object obj) {
        // 比較的是地址
        // return super.equals(obj);
        // 現在需求比對姓名和年齡
        Student student = (Student)obj;
        return this.name.equals(student.getName()) && this.age == student.getAge();
    }
}