淺談Java中的集合

集合概述

面嚮對象語言對事物的體現都是以對象的形式,爲了方便對多個對象的操作,Java就提供了集合類。

數組和集合的區別:

  • 長度區別:
    數組的長度是固定的;集合的長度是可變的
  • 存儲數據類型的區別:
    數組可以存儲基本數據類型,也可以存儲引用數據類型數據;集合只能存儲引用數據類型
  • 內容區別:
    數組只能存儲同種數據類型的元素;集合可以存儲不同類型的元素

Collection集合

Collection集合是集合的頂層父接口,其繼承體系如圖:

下面先談談Collection集合吧。

Collection 層次結構 中的根接口。Collection 表示一組對象,這些對象也稱爲 collection 的元素。一些 collection 允許有重複的元素,而另一些則不允許。一些 collection 是有序的,而另一些則是無序的。

成員方法

將成員方法按功能分:
添加功能

  • boolean add(Object obj):添加一個元素
  • boolean addAll(Collection c):添加一個集合的元素 (給一個集合添加進另一個集合中的所有元素)

刪除功能

  • void clear():移除所有元素
  • boolean remove(Object o):移除一個元素
  • boolean removeAll(Collection c):移除一個集合的元素(移除一個以上返回的就是true) 刪除的元素是兩個集合的交集元素,如果沒有交集元素 則刪除失敗 返回false

判斷功能

  • boolean contains(Object o):判斷集合中是否包含指定的元素
  • boolean containsAll(Collection c):判斷集合中是否包含指定的集合元素(這個集合 包含 另一個集合中所有的元素纔算包含 才返回true)
  • boolean isEmpty():判斷集合是否爲空

獲取功能

  • Iterator iterator()(迭代器)

長度功能

  • int size():元素的個數

交集功能

  • boolean retainAll(Collection c):獲取兩個集合的交集元素(交集:兩個集合都有的元素)

把集合轉換爲數組

  • Object[] toArray()

集合元素的遍歷
當集合的對象使用Collection類型來接收的時候,對於集合中的元素的遍歷,有兩種方式:

  • 將集合轉爲數組,再進行遍歷
public class Demo6 {
    public static void main(String[] args) {
        // 將3個學生的信息存儲到數組中,並遍歷數組,獲取得到每一個學生信息
        Student s1 = new Student("張三", 23);
        Student s2 = new Student("李四", 21);
        Student s3 = new Student("王五", 22);
        Collection arrayList = new ArrayList();
        arrayList.add(s1);
        arrayList.add(s2);
        arrayList.add(s3);
        Object[] objects = arrayList.toArray();
        for (int i = 0; i < objects.length; i++) {
            Student stu= (Student) objects[i];
            System.out.println(stu.getName()+"----"+stu.getAge());
        }
    }
}

class Student{
    private String name;
    private int age;

    public Student() {
    }

    public Student(String name, int age) {
        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;
    }
}

  • 使用迭代器進行遍歷
    先獲取迭代器,再判斷是否有下一個元素(hasNext()方法),有的話就獲取下一個元素(next()方法)。
public class Demo6 {
    public static void main(String[] args) {
        // 將3個學生的信息存儲到數組中,並遍歷數組,獲取得到每一個學生信息
        Student s1 = new Student("張三", 23);
        Student s2 = new Student("李四", 21);
        Student s3 = new Student("王五", 22);
        Collection arrayList = new ArrayList();
        arrayList.add(s1);
        arrayList.add(s2);
        arrayList.add(s3);
        // 使用迭代器進行遍歷
        Iterator iterator = arrayList.iterator();   // 獲取迭代器
        while (iterator.hasNext()){    
            Object o = iterator.next();
            Student stu = (Student) o;
            System.out.println(stu.getName()+"----"+stu.getAge());
        }
       
    }
}

List集合


List中的元素特點:元素有序,並且每一個元素都存在一個索引。元素可以重複。

List集合的特有功能

由於List繼承了Collection,所以Collection的方法List都可以使用,但它還有自己獨特的功能。




常用的方法
void add(int index,E element):在指定索引處添加元素
E remove(int index):移除指定索引處的元素 返回的是移除的元素
E get(int index):獲取指定索引處的元素
E set(int index,E element):更改指定索引處的元素 返回的而是被替換的元素

集合元素的遍歷
當集合的對象使用List類型來接收的時候,對於集合中的元素的遍歷,有以下幾種方式:

  • 由於List是Collection的子接口,所以Collection遍歷元素的方式,List完全可以用。即可以將集合轉換成數組,可以使用Collection的迭代器進行遍歷。
  • 由於List中有自己獨特的迭代器(ListIterator),所以也可以使用List自己的迭代器來進行遍歷。
public class Demo6 {
    public static void main(String[] args) {
        // 將3個學生的信息存儲到數組中,並遍歷數組,獲取得到每一個學生信息
        Student s1 = new Student("張三", 23);
        Student s2 = new Student("李四", 21);
        Student s3 = new Student("王五", 22);
        //List arrayList = new ArrayList();
        Collection arrayList = new ArrayList();
        arrayList.add(s1);
        arrayList.add(s2);
        arrayList.add(s3);
        // 使用列表迭代器進行遍歷
        ListIterator listIterator = arrayList.listIterator();
        while (listIterator.hasNext()){
            Object next = listIterator.next();
            Student student= (Student) next;
            System.out.println(student.getName()+"----"+student.getAge());
        }
     
    }
}

class Student{
    private String name;
    private int age;

    public Student() {
    }

    public Student(String name, int age) {
        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;
    }
}

需要注意的是,ListIterator 繼承自Iterator 可以使用Iterator中的方法,同時,ListIterator有自己的特有功能:
boolean hasPrevious(): 是否存在前一個元素
E previous(): 返回列表中的前一個元素

以上兩個方法可以實現反向遍歷 但是注意 要完成反向遍歷之前 要先進行正向遍歷 這樣指針才能移到最後。如果直接反向遍歷是沒有效果的 因爲指針默認位置就在最前面,他前面沒有元素。

  • List中有一個get()方法,用於獲取對應索引處的元素值。所以可以結合size()方法和get()方法來進行遍歷。
public class Demo6 {
    public static void main(String[] args) {
        // 將3個學生的信息存儲到數組中,並遍歷數組,獲取得到每一個學生信息
        Student s1 = new Student("張三", 23);
        Student s2 = new Student("李四", 21);
        Student s3 = new Student("王五", 22);
        //List arrayList = new ArrayList();
        Collection arrayList = new ArrayList();
        arrayList.add(s1);
        arrayList.add(s2);
        arrayList.add(s3);
        // 使用size和get方法進行遍歷
        for (int i = 0; i < arrayList.size(); i++) {
            Object o = arrayList.get(i);
            Student student= (Student) o;
            System.out.println(student.getName()+"----"+student.getAge());
        }
    }
}

class Student{
    private String name;
    private int age;

    public Student() {
    }

    public Student(String name, int age) {
        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;
    }
}

List下有多個子類,但常用的子類有ArrayList、Vector、LinkedList。
這三個子類的特點爲:

  • ArrayList
    底層數據結構是數組,查詢快,增刪慢
    線程不安全,效率高
  • Vector
    底層數據結構是數組,查詢快,增刪慢
    線程安全,效率低
  • LinkedList
    底層數據結構是鏈表,查詢慢,增刪快
    線程不安全,效率高

那麼問題來了,在這三個類中我們該如何選擇使用呢?
看我們程序的需求,是要安全還是要效率以及是要查找多還是增刪多,依據這些來選擇我們需要使用的子類。

下面來談談這三個子類。

ArrayList


List 接口的大小可變數組的實現。實現了所有可選列表操作,並允許包括 null 在內的所有元素。除了實現 List 接口外,此類還提供一些方法來操作內部用來存儲列表的數組的大小。
每個 ArrayList 實例都有一個容量。該容量是指用來存儲列表元素的數組的大小。它總是至少等於列表的大小。隨着向 ArrayList 中不斷添加元素,其容量也自動增長。並未指定增長策略的細節,因爲這不只是添加元素會帶來分攤固定時間開銷那樣簡單。

構造方法

成員方法

集合元素的遍歷
由於ArrayList是List的子類,所以可以使用轉換成數組迭代器以及size()和get方法結合的方式進行元素的遍歷,除此之外還可以用JDK1.8新增的一個方法void forEach(Consumer<? super E> action) 遍歷元素。
void forEach(Consumer<? super E> action) 執行特定動作的每一個元素的 Iterable直到所有元素都被處理或操作拋出異常 。

Vector


Vector 類可以實現可增長的對象數組, Vector 是同步的。與數組一樣,它包含可以使用整數索引進行訪問的組件。但是,Vector 的大小可以根據需要增大或縮小,以適應創建 Vector 後進行添加或移除項的操作。
構造方法
在這裏插入圖片描述

成員方法



LinkedList


List 接口的鏈接列表實現,此實現不是同步的。實現所有可選的列表操作,並且允許所有元素(包括 null)。除了實現 List 接口外,LinkedList 類還爲在列表的開頭及結尾 get、remove 和 insert 元素提供了統一的命名方法。這些操作允許將鏈接列表用作堆棧、隊列或雙端隊列。

構造方法

成員方法



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