Java語言基礎(集合Collection和其子接口List及泛型)

集合Collection

集合類的作用:方便操作多個對象。

在這裏插入圖片描述

集合與數組之間的區別:
(1): 長度區別:
數組的長度是固定的而集合的長度是可變的
(2): 存儲數據類型的區別:
數組可以存儲基本數據類型 , 也可以存儲引用數據類型; 而集合只能存儲引用數據類型
(3): 內容區別:
數組只能存儲同種數據類型的元素 ,集合可以存儲不同類型的元素

1.Collection集合的功能(方法)概述

Collection集合的方法 概述
boolean add(Object obj) 添加一個元素
boolean addAll(Collection c) 添加一個集合的元素
void clear() 移除所有元素
boolean removeAll(Collection c) 刪除的元素是兩個集合的交集元素
boolean remove(Object o) 移除一個元素
boolean contains(Object o) 判斷集合中是否包含指定的元素
boolean containsAll(Collection c) 判斷這個集合 是否包含 另一個集合中所有的元素
boolean isEmpty() 判斷集合是否爲空
int size() 元素的個數

2.迭代器(Iterator):用來遍歷數據結構

public class MyTest {
    public static void main(String[] args) {
        Collection collection1 = new ArrayList();
        collection1.add("美國隊長");
        collection1.add("鋼鐵俠");
        collection1.add("雷神");
        collection1.add("黑寡婦");
        Iterator iterator = collection1.iterator();
        Object next = iterator.next();//手動移動
        while (iterator.hasNext()){
            Object obj= iterator.next();
            System.out.println(obj);
        }
    }
}

在這裏插入圖片描述

Iterator接口的子接口(ListIterator)
ListIterator特有的方法 概述
boolean hasPrevious(): 是否存在前一個元素
E previous(): 返回列表中的前一個元素

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

併發修改異常(ConcurrentModificationException)出現的原因

原因是:我們的迭代依賴與集合 當我們往集合中添加好了元素之後 獲取迭代器 , 那麼迭代器已經知道了集合的元素個數;
這個時候你在遍歷的時候又突然想給 集合裏面加一個元素(用的是集合的add方法),就會出現併發修改異常。

如何更改:

  • 採用迭代器自帶的add方法添加元素(ListIterator.add());
  • 使用for循環遍歷元素。

3.Collection的子接口List

List集合特有的功能

方法 概述
void add(int index,E element) 在指定索引處添加元素
E remove(int index) 移除指定索引處的元素
E get(int index) 獲取指定索引處的元素
E set(int index,E element) 更改指定索引處的元素

4.List的三個子類

(1)三個子類(ArrayList,Vector,LinkedList)之間的區別:

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

(2)ArrayList特有的方法功能

void forEach(Consumer<? super E> action) 執行特定動作的每一個元素的 Iterable直到所有元素都被處理或操作拋出異常

(3)Vector特有的方法功能

public void addElement(E obj) 將指定的數據類型添加到此向量的末尾,使其大小增加1.
public E elementAt(int index) 在指定的索引處加入指定的數據類型
public void setElementAt(E obj, int index) 將指定索引處的組件設置爲指定的對象
public boolean removeElement(Object obj) 移除索引最小的匹配項

(4)LinkedList特有的方法功能

public void addFirst(E e) 將指定的元素插入集合的開頭
public void addLast(E e) 將指定的元素插入集合的末尾
public E getFirst() 返回此集合的第一個元素
public E getLast() 返回此集合的最後一個元素
public E removeFirst() 移除此集合的第一個元素
public E removeLast() 移除此元素的最後一個元素

5.泛型

採用泛型的目的:解決需要轉型的問題。
(1)泛型類

public class 類名<泛型類型1,>

注意:泛型類型必須是引用類型

(2)泛型方法

public <泛型類型> 返回類型 方法名(泛型類型 變量名)

(3)泛型接口

public interface 接口名<泛型類型>

(4)泛型通配符

  • 通配符<?> 任意類型,如果沒有明確,那麼就是Object以及任意的Java類了
  • ? extends E (向下限定,E及其子類)
  • ? super E (向上限定,E及其父類)
public class MyTest2 {
    public static void main(String[] args) {
        ArrayList<Dog> objects = new ArrayList<Dog>();
        //?泛型統配符
        ArrayList<?> objects2 = new ArrayList<Cat>();
        //向上限定
        ArrayList<? super Animal> objects3 = new ArrayList<Animal>();
        ArrayList<? super Animal> objects4 = new ArrayList<Object>();
        //向下限定
        ArrayList<? extends Animal> objects5 = new ArrayList<Dog>();
        ArrayList<? extends Animal> objects6= new ArrayList<Cat>();
        ArrayList<? extends Animal> objects7 = new ArrayList<Animal>();
    }
}
class Animal{
}
class Dog extends Animal{
}
class Cat extends Animal{}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章