天天看點

Java之集合(二)

在開發中,常用的數組和ArrayList集合類,數組和數組集合都有一個重大的缺陷,就是從數組中間位置删除一個元素要付出很大的代價,因為在數組中處于被删除的元素之後的所有元素都要向數組前端移動,插入一個元素也是如此,資料結構--連結清單解決了這個問題.數組是在連續的存儲位置上存放對象的引用,連結清單将每個對象存放在獨立的結點中,每個結點都會存放序列中下一個結點的引用.在連結清單中删除一個元素就隻需要更新被删除元素附近的結點引用連結.

示例:

public class LinkedListDemo {
     public static void main(String[] args) {
        List<String> list = new LinkedList<>();
        list.add("A");
        list.add("B");
        Collection<String> collection = new LinkedList<>();
        collection.add("C");
        collection.add("D");
        list.addAll(collection);
        list.add(2,"F");//在下标為2的元素後面插入一個元素
        List<String> linkList = new LinkedList<>();
        linkList.add("G");
        linkList.add("H");
        list.addAll(3,linkList);//在下标為3的元素後面插入一個集合
        Iterator iterator = list.iterator();
        //删除兩個元素 先調用next()方法
        iterator.next();
        iterator.next();
        iterator.remove();
        iterator.forEachRemaining(e -> System.out.println(e.toString()));
    }
}

           

運作結果

Java之集合(二)

連結清單和集合有個重要的差別,連結清單是個有序集合,LinkedList的add()方法在連結清單的尾部添加一個元素,但是實際開發中往往需要将元素添加到連結清單的中間.使用疊代器可以實作這個需求,疊代器可以得到集合中元素的位置,是以依賴位置的add()方法由疊代器負責,隻有有序集合使用疊代器添加元素才有意義

例如:Set集合,無序,在疊代器Iterator中沒有add方法,Java提供了一個子接口ListIterator,子接口中有add()方法,在

Java之集合(一)

中有介紹疊代器Iterator中的方法,下面介紹子接口ListIterator中的方法:

ListIterator

  • boolean hasNext(); 周遊元素,有元素傳回true
  • E next(); 傳回清單中的下一個元素
  • boolean hasPrevious(); 反向周遊元素,若還有元素傳回true
  • E previous(); 傳回清單中的前一個元素
  • int nextIndex(); 傳回将由後續調用next()傳回的元素的索引。
  • int previousIndex(); 傳回将由後續調用previous()傳回的元素的索引
  • void remove(); 移除元素
  • void set(E e); 替換next()或者previous()傳回的上一個元素
  • void add(E e); 将指定元素插入清單

1.ListIterator中的add()方法與Collection中的add()方法不同,Collection中的add()方法傳回boolean類型,而ListIteratorzhon中的add()方法不傳回boolean,它假定每次操作都會改變連結清單,在疊代器位置之前添加一個元素.

2.previous()方法與next()方法一樣,傳回被越過的對象,與之不同的是,傳回的是前一個對象,和hasPrevious()方法一起yon用來反向周遊清單

3.set()方法用一個新元素替代調用next()或previous()傳回的上一個元素

連結清單可以減少插入或删除元素付出的代價,但是不支援快速的随機通路,每次查找一個元素都要從清單頭部開始重新搜尋,LinkedList不做任何緩存元素位置的操作.

List

  • int size();傳回此清單中的元素數量
  • boolean isEmpty();如果該清單不包含元素,則傳回true。
  • boolean contains(Object o);如果該清單包含指定的元素,則傳回true。
  • Iterator iterator();按正确的順序傳回清單中元素的疊代器。
  • Object[] toArray();傳回一個數組,該數組按适當的順序(從第一個元素到最後一個元素)包含清單中的所有元素
  • T[] toArray(T[] a);傳回一個數組,該數組包含清單中所有元素的不正确序列(從第一個元素到最後一個元素);傳回數組的運作時類型是指定數組的運作時類型。如果清單符合指定的數組,則傳回其中的清單。否則,将使用指定數組的運作時類型和該清單的大小配置設定一個新數組
  • boolean add(E e);将指定的元素追加到此清單的末尾
  • boolean remove(Object o);從清單中删除指定元素的第一個出現項(如果存在)(可選操作)。如果此清單不包含元素,它沒有改變
  • boolean containsAll(Collection<?> c);如果此清單包含指定集合的所有元素,則傳回true
  • boolean addAll(Collection<? extends E> c);将指定集合中的所有元素按照指定集合的疊代器傳回的順序追加到此清單的末尾
  • boolean addAll(int index, Collection<? extends E> c);将指定集合中的所有元素插入到此清單的指定位置
  • boolean removeAll(Collection<?> c);從該清單中删除指定集合中包含的所有元素
  • boolean retainAll(Collection<?> c);從這個清單中删除指定集合中不包含的所有元素

    1.8

  • default void replaceAll(UnaryOperator operator)将運算符應用于該元素的結果替換此清單中的每個元素。操作符抛出的錯誤或運作時異常将傳遞給調用者
  • default void sort(Comparator<? super E> c) 根據指定的元素所引發的順序對該清單進行排序
  • void clear();從清單中删除所有元素
  • boolean equals(Object o); 将指定的對象與此清單進行相等性比較。當且僅當指定的對象也是一個清單時,傳回true
  • int hashCode();傳回清單的hash值
  • E get(int index);傳回指定位置的元素
  • E set(int index, E element); 用指定的元素(可選操作)替換清單中指定位置的元素
  • void add(int index, E element);在指定位置添加指定元素
  • E remove(int index);移除指定元素
  • int indexOf(Object o);傳回此清單中指定元素的第一個出現項的索引,如果該清單不包含該元素,則傳回-1。
  • int lastIndexOf(Object o);傳回此清單中指定元素的最後一次出現的索引,如果該清單不包含該元素,則傳回-1
  • ListIterator listIterator();傳回清單中元素的清單疊代器
  • ListIterator listIterator(int index);傳回清單中元素的清單疊代器,從清單中的指定位置開始
  • List subList(int fromIndex, int toIndex);傳回清單中指定的fromIndex(包括)和toIndex(排除)之間的部分的視圖
  • default Spliterator spliterator() 為清單中的元素添加一個Spliterator

LinkedList

  • public LinkedList() 構造一個空連結清單
  • public LinkedList(Collection<? extends E> c) 構造一個連結清單,将元素添加到連結清單中
  • public E getFirst() 傳回清單第一個元素
  • public E getLast()傳回清單最後一個元素
  • public E removeFirst()移除清單第一個元素
  • public E removeLast()移除清單最後一個元素
  • public void addFirst(E e)将元素添加到頭部
  • public void addLast(E e)将元素添加到尾部
  • public E pollFirst()檢索并删除此清單的第一個元素
  • public E pollLast()檢索并删除此清單的最後一個元素
  • public void push(E e)将元素插入到清單的前面
  • public E pop()删除并傳回清單的第一個元素
  • public boolean removeFirstOccurrence(Object o)删除此清單中指定元素的第一個出現項(當從頭到尾周遊清單時)。如果清單不包含該元素,它将保持不變
  • public boolean removeLastOccurrence(Object o)删除此清單中指定元素的最後一次出現(當從頭到尾周遊清單時)。如果清單不包含該元素,它将保持不變
  • public Object clone()傳回此LinkedList清單的副本。(元素本身不是克隆的)
  • public Object[] toArray() 傳回一個數組,該數組按正确的順序(從第一個元素到最後一個元素)包含此清單中的所有元素。
  • public T[] toArray(T[] a)傳回一個數組,該數組按正确的順序(從第一個元素到最後一個元素)包含此清單中的所有元素;傳回的數組的運作時類型是指定數組的運作時類型。如果清單符合指定的數組,則傳回該清單。否則,将為新數組配置設定指定數組的運作時類型和此清單的大小。
  • public Spliterator spliterator() 在該清單中的元素上建立一個延遲綁定。
  • public void forEachRemaining(Consumer<? super E> action) 傳回一個元素
  • public boolean tryAdvance(Consumer<? super E> action) 嘗試綁定,執行成功傳回true
  • public int characteristics() 傳回Spliterator的指令或大小或尺寸

List接口用于描述一個有序集合,集合中每個元素的位置十分重要,有兩種通路元素的協定,第一種是使用疊代器,第二種是用get和set方法随機通路每個元素,後者不适合用于連結清單,但是對數組很有用,經常用到的ArrayList類也實作了List接口,ArrayList封裝了一個動态再配置設定的對象數組.