集合之List接口

1.List接口介紹

  • List是有序的 Collection(也稱為序列)。此接口的用戶可以對列表中每個元素的

插入位置進行精確地控制。用戶可以根據(jù)元素的整數(shù)索引(在列表中的位置)訪

問元素,并搜索列表中的元素。與 set 不同,列表通常允許重復(fù)的元素。

  • List接口的特點:

1) 它是一個元素存取有序的集合。例如,存元素的順序是11、22、33,那么集

合中元素的存儲就是按照11、22、33的順序完成的。

2)它是一個帶有索引的集合,通過索引就可以精確的操作集合中的元素(與數(shù)組

的索引是一個道理)。

3)集合中可以有重復(fù)的元素,通過元素的equals方法,來比較是否為重復(fù)的元素。

  • List接口的常用子類有:

1 ) ArrayList集合
2 ) LinkedList集合
3 ) Vector集合

1.1常用方法

Modifier and Type Method and Description
boolean add(E e) 將指定的元素追加到此列表的末尾。
void add(int index, E element) 在此列表中的指定位置插入指定的元素。
void clear() 從列表中刪除所有元素。
boolean contains(Object o) 如果此列表包含指定的元素,則返回 true 。
E get(int index) 返回此列表中指定位置的元素。
boolean isEmpty() 如果此列表不包含元素,則返回 true
Iterator<E> iterator() 以正確的順序返回該列表中的元素的迭代器。
E remove(int index) 刪除該列表中指定位置的元素。
boolean remove(Object o) 從列表中刪除指定元素的第一個出現(xiàn)(如果存在)。
boolean removeAll(Collection<?> c) 從此列表中刪除指定集合中包含的所有元素。
E set(int index, E element) 用指定的元素替換此列表中指定位置的元素。
int size() 返回此列表中的元素數(shù)。

2.ArraysList

2.1介紹

ArrayList集合數(shù)據(jù)存儲的結(jié)構(gòu)是數(shù)組結(jié)構(gòu)。元素增刪慢,查找快,由于日常開

發(fā)中使用最多的功能為查詢數(shù)據(jù)、遍歷數(shù)據(jù),所以ArrayList是最常用的集合。

許多程序員開發(fā)時非常隨意地使用ArrayList完成任何需求,并不嚴謹,這種用

法是不提倡的。

2.2代碼示例

package Collection_list_map.list;

import java.util.ArrayList;
import java.util.List;
import java.util.Objects;

class Teacher{
    private String name;//老師姓名
    private String no;//老師工號

    public Teacher(String name, String no) {
        this.name = name;
        this.no = no;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public String getNo() {
        return no;
    }

    public void setNo(String no) {
        this.no = no;
    }

    @Override
    public String toString() {
        return "Teacher{" +
                "name='" + name + '\'' +
                ", no='" + no + '\'' +
                '}';
    }

    @Override
    public boolean equals(Object o) {
        if (this == o) return true;
        if (o == null || getClass() != o.getClass()) return false;
        Teacher teacher = (Teacher) o;
        return Objects.equals(this.name, teacher.name) &&
                Objects.equals(this.no, teacher.no);
    }
}
public class ArraysList {
    public static void main(String[] args) {
        Teacher t1 = new Teacher("wcq","35");
        Teacher t2 = new Teacher("kql","36");
        Teacher t3 = new Teacher("hej","34");
        Teacher t4 = new Teacher("wcq","35");

        List<Teacher> list = new ArrayList<Teacher>();
        list.add(t1);
        list.add(t2);
        list.add(t3);

        System.out.println("~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~");
        for (int i = 0; i < list.size(); i++) {
            System.out.println(list.get(i).toString());
            System.out.println(list.get(i));
        }
        System.out.println("~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~");
        System.out.println(list.get(1).toString());
        System.out.println("~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~");
        list.remove(2);
        for (int i = 0; i < list.size(); i++) {
            System.out.println(list.get(i).toString());
        }
        System.out.println("~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~");
        System.out.println(list.isEmpty());
        System.out.println("~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~");
        System.out.println(list.contains(t1));
        System.out.println("~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~");
        System.out.println(list.contains(t4));
        System.out.println("~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~");
        list.clear();
        for (int i = 0; i < list.size(); i++) {
            System.out.println(list.get(i).toString());
        }
        System.out.println("說明沒有數(shù)據(jù)");
    }
}

運行結(jié)果:

~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Teacher{name='wcq', no='35'}
Teacher{name='wcq', no='35'}
Teacher{name='kql', no='36'}
Teacher{name='kql', no='36'}
Teacher{name='hej', no='34'}
Teacher{name='hej', no='34'}
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Teacher{name='kql', no='36'}
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Teacher{name='wcq', no='35'}
Teacher{name='kql', no='36'}
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
false
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
true
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
true
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
說明沒有數(shù)據(jù)

2.3 底層結(jié)構(gòu)

  • ArrayList底層的數(shù)據(jù)結(jié)構(gòu)使用的是數(shù)組。
    這種數(shù)據(jù)結(jié)構(gòu)的特點是:

1)查找元素快:通過索引,可以快速訪問指定位置的元素

  1. 增刪元素慢:
    2.1)指定索引位置增加元素:需要創(chuàng)建一個新數(shù)組,將指定新元素存儲在指定索引位置,再把原數(shù)組元素根據(jù)索引,復(fù)制到新數(shù)組對應(yīng)索引的位置。
    2.2) 指定索引位置刪除元素:需要創(chuàng)建一個新數(shù)組,把原數(shù)組元素根據(jù)索引,復(fù)制到新數(shù)組對應(yīng)索引的位置,原數(shù)組中指定索引位置元素不復(fù)制到新數(shù)組中。


    1659022528972.png

2.4contains方法檢查元素是否重復(fù)

ArrayList的contains方法判斷元素是否存在,判斷的原理如下:

ArrayList的contains方法被調(diào)用時,用傳入元素的equals方法依次與集合中的舊元素進行比較,根據(jù)返回的布爾值判斷是否有重復(fù)元素。此時,當(dāng)ArrayList存放自定義類型時,由于自定義類型在未重寫equals方法前,判斷是否重復(fù)的依據(jù)是地址值,所以如果想根據(jù)內(nèi)容判斷是否為重復(fù)元素,需要重寫元素的equals方法。

  • Teacher類未重寫equals方法前,判斷集合中是否包含指定的老師
public static void main(String[] args) {
    //1:創(chuàng)建兩個工號和姓名相同老師對象
    Teacher t1 = new Teacher("02", "劉邦");
    Teacher t2 = new Teacher("02", "劉邦");

    //2:創(chuàng)建老師集合
    List<Teacher> list =new ArrayList<Teacher>();

    //3:向集合中添加t1老師
    list.add(t1);

    //4:判斷l(xiāng)ist集合中是否有t2老師
    System.out.println(list.contains(t2));//結(jié)果是false
}

最后一行代碼 t2調(diào)用equals方法與list集合中的每一個對象比較,默認比較內(nèi)存地址編號。

  • 在老師類中重新equals方法
    @Override
    public boolean equals(Object o) {
        if (this == o) return true;
        if (o == null || getClass() != o.getClass()) return false;
        Teacher teacher = (Teacher) o;
        return Objects.equals(this.name, teacher.name) &&
                Objects.equals(this.no, teacher.no);
    }

Teacher類重寫equals方法后,再次運行程序

public static void main(String[] args) {
    //1:創(chuàng)建兩個工號和姓名相同老師對象
    Teacher t1 = new Teacher("02", "劉邦");
    Teacher t2 = new Teacher("02", "劉邦");

    //2:創(chuàng)建老師集合
    List<Teacher> list =new ArrayList<Teacher>();

    //3:向集合中添加t1老師
    list.add(t1);

    //4:判斷l(xiāng)ist集合中是否有t2老師
    System.out.println(list.contains(t2));//結(jié)果是true
}

最后一行 t2調(diào)用equals方法與list集合中的每一個對象比較,調(diào)用的是重寫后的equals方法。

3.Vector

Vector集合數(shù)據(jù)存儲的結(jié)構(gòu)是數(shù)組結(jié)構(gòu),為JDK中最早提供的集合。Vector中提

供了一個獨特的取出方式,就是枚舉Enumeration,它其實就是早期的迭代器。

此接口Enumeration的功能與 Iterator 接口的功能是類似的。Vector集合已被

ArrayList替代。枚舉Enumeration已被迭代器Iterator替代。

Vector與ArrayList不同的是Vector類是線程安全的,ArrayList是非線程安全的。

Vector的用法與ArrayList相同:

/**
 * 使用Vector集合操作Teacher對象
 */
class Teacher {
    private String name;//老師姓名
    private String no;//老師工號

    public Teacher(String name, String no) {
        this.name = name;
        this.no = no;
    }
    @Override
    public String toString() {
        return "Teacher{" +
                "name='" + name + '\'' +
                ", no='" + no + '\'' +
                '}';
    }
}

public class Demo {
    public static void main(String[] args) {
        //1:創(chuàng)建三個老師對象
        Teacher t1 = new Teacher("01", "朱元璋");
        Teacher t2 = new Teacher("02", "劉邦");
        Teacher t3 = new Teacher("03", "李自成");

        //2:創(chuàng)建老師集合
        List<Teacher> list = new Vector<>();

        //3:向集合中添加老師
        list.add(t1);
        list.add(t2);
        list.add(t3);

        //4:迭代(遍歷)老師
        System.out.println("======================");
        show(list);

        //5:從集合中獲取第一個老師
        System.out.println("======================");
        Teacher t = list.get(0);
        System.out.println(t);

        //6:刪除第一個老師
        list.remove(0);
        System.out.println("======================");
        show(list);

        //7:顯示集合中老師的人數(shù)
        System.out.println(list.size());

        //8:集合中有老師嗎
        System.out.println(list.isEmpty());

        //9:查找劉邦老師
        System.out.println(list.contains(t2));

        //10:逐一刪除集合中的數(shù)據(jù)
        int last = list.size();
        for (int i = 0; i < last; i++) {
            list.remove(0);
        }
        //11:批量刪除
        list.clear();
        System.out.println("======================");
        show(list);

    }

    private static void show(List<Teacher> list) {
        Iterator<Teacher> iterator = list.iterator();
        while (iterator.hasNext()) {
            System.out.println(iterator.next());
        }
    }
}

4.LinkedList類

4.1介紹

LinkedList集合數(shù)據(jù)存儲的結(jié)構(gòu)是鏈表結(jié)構(gòu)。方便元素添加、刪除的集合。實際開發(fā)中對一個集合元素的添加與刪除經(jīng)常涉及到首尾操作,而LinkedList提供了大量首尾操作的方法。

LinkedList類是List的子類,List中的方法LinkedList都是可以使用。在開發(fā)時,LinkedList集合也可以作為棧,隊列的結(jié)構(gòu)使用,LinkedList類為棧和隊列操作提供了相應(yīng)的方法。

4.2常用方法

Modifier and Type Method and Description
boolean add(E e) 將指定的元素追加到此列表的末尾。
void add(int index, E element) 在此列表中的指定位置插入指定的元素。
void addFirst(E e) 在該列表開頭插入指定的元素。
void addLast(E e) 將指定的元素追加到此列表的末尾。
void clear() 從列表中刪除所有元素。
boolean contains(Object o) 如果此列表包含指定的元素,則返回 true 。
E get(int index) 返回此列表中指定位置的元素。
E getFirst() 返回此列表中的第一個元素。
E getLast() 返回此列表中的最后一個元素。
E pop() 從此列表表示的堆棧中彈出一個元素。
void push(E e) 將元素推送到由此列表表示的堆棧上。
E remove() 檢索并刪除此列表的頭(第一個元素)。
E remove(int index) 刪除該列表中指定位置的元素。
boolean remove(Object o) 從列表中刪除指定元素的第一個出現(xiàn)(如果存在)。
E removeFirst() 從此列表中刪除并返回第一個元素。
E removeLast() 從此列表中刪除并返回最后一個元素。
E set(int index, E element) 用指定的元素替換此列表中指定位置的元素。
int size() 返回此列表中的元素數(shù)。
Object[] toArray() 以正確的順序(從第一個到最后一個元素)返回一個包含此列表中所有元素的數(shù)組。
<T> T[] toArray(T[] a) 以正確的順序返回一個包含此列表中所有元素的數(shù)組(從第一個到最后一個元素);

4.3代碼演示

List中的方法LinkedList都是可以使用,這里不再給出例子,請參考ArrayList類的代碼演示。

在這里給出LinkedList的特有操作方法。

public static void main(String[] args) {
    //1:創(chuàng)建兩個工號和姓名相同老師對象
    Teacher t1 = new Teacher("01", "朱元璋");
    Teacher t2 = new Teacher("02", "劉邦");
    Teacher t3 = new Teacher("03", "李自成");

    //2:創(chuàng)建老師集合
    LinkedList<Teacher> list =new LinkedList<>();

    //添加元素
    list.addFirst(t1);
    list.addFirst(t2);
    list.addLast(t3);

    //獲取元素
    System.out.println(list.getFirst());
    System.out.println(list.getLast());

    //刪除元素
    System.out.println(list.removeFirst());
    System.out.println(list.removeLast());

    while(!list.isEmpty()){ //判斷集合是否為空
        System.out.println(list.pop()); //彈出集合中的棧頂元素,棧頂元素從集合中被移除
    }
}

4.4底層數(shù)據(jù)結(jié)構(gòu)

LinkedList底層的數(shù)據(jù)結(jié)構(gòu)使用的是鏈表。

這種數(shù)據(jù)結(jié)構(gòu)的特點是:

  • 查找元素慢:想查找某個元素,需要通過連接的節(jié)點,依次向后查找指定元素
  • 增刪元素快:增加元素,只需要修改連接下個元素的地址即可,所有元素?zé)o需移動位置
  • 刪除元素快:只需要修改連接下個元素的地址即可,所有元素?zé)o需移動位置


    1659097989359.png
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容