1. 程式人生 > >Java學習筆記之List集合

Java學習筆記之List集合

List是一個有序集合介面,實現該介面,可以精確控制列表中每個元素的插入位置,可以通過整數索引訪問元素,並搜尋列表中的元素。List允許重複,如果不允許重複,建議使用Set集合。

包含方法:

  1. int size(); 返回集合中的元素的數量,集合數量上限為Integer.MAX_VALUE
  2. boolean isEmpty(); 如果列表中沒有元素,返回true
  3. boolean contains(Object o); 如果集合中包含o元素,返回true。規定A:如果指定元素的型別與此集合不相容,則丟擲異常ClassCastException。規定B:如果此集合不允許null元素,並且指定的元素為null,則丟擲異常NullPointerException
  4. Iterator iterator();返回一個迭代器,該迭代器管理此集合中的元素。
  5. Object[] toArray();返回包含此列表中所有元素的陣列。規定A:返回的陣列需要重新分配一個新的陣列,使返回的陣列足夠安全,後續操作不受當前集合影響。
  6. T[] toArray(T[] a);功能如同Object[] toArray(),規定A:如果指定陣列的型別和集合中的元素型別不匹配,則丟擲ArrayStoreException。規定B:如果指定的陣列為null,則丟擲NullPointerException。
    List<String> linkedList = new
    LinkedList<>(arrayList); for(int i =0;i<100;i++) linkedList.add("qqq"); String[] y = linkedList.toArray(null); Log.w("列印"," "+y.length);
    以上程式碼不會走Log,直接丟擲NullPointerException。
  7. boolean add(E e);將指定的元素追加到集合末尾。規定A:如果對新增型別有限制,請在文件寫明。規定B:如果集合不支援add操作,丟擲UnsupportedOperationException。規定C:如果指定元素型別不匹配,丟擲ClassCastException。規定D:如果指定元素為null,並且本集合不允許null,丟擲NullPointerException。規定E:如果元素中某些元素不匹配,丟擲IllegalArgumentException。
  8. boolean remove(Object o);刪除匹配到的第一個(或者多個,由實現類決定)如果匹配到,返回true,否則返回false。如果沒有匹配到,不會更改。規定A:如果指定型別不匹配,丟擲ClassCastException。規定B:如果指定元素為null並且本集合不允許null元素,丟擲NullPointerException。規定C:如果本集合不支援remove操作,丟擲UnsupportedOperationException。
  9. boolean containsAll(Collection<?> c);如果本集合包含指定集合中所有元素,返回true,否則返回false。規定A:如果指定集合中有元素和本集合中元素型別不匹配,丟擲ClassCastException。規定B:如果指定集合中有元素為null,並且本集合不允許null元素,丟擲NullPointerException。
    List<String> arrayList = new ArrayList<>();
    for(int i =0;i<50;i++){
        arrayList.add("aaa"+i);
    }
    arrayList.add("aaa"+49);
    List<String> linkedList = new LinkedList<>(arrayList);
    for(int i =0;i<100;i++){
        linkedList.add("aaa"+i);
    }
    boolean isContains = linkedList.containsAll(arrayList);
    Log.w("列印"," "+isContains);
    
    輸出依然為true,就說明預設情況下不管重複不重複,只用指定集合中每個元素和當前集合匹配。
  10. boolean addAll(Collection<? extends E> c);將指定集合中的所有元素追加到此集合的末尾(順序可以自己定義),如果新增過程中修改了指定的集合,操作結果是不確定的。如果新增之後集合更改了,則返回true,否則返回false。規定A:如果此集合不支援addAll()方法,丟擲UnsupportedOperationException。規定B:如果指定集合中的元素型別和本集合型別不同,丟擲ClassCastException。規定C:如果本集合不允許null元素,指定集合中有null元素;或者指定元素為null,丟擲NullPointerException。規定D:如果元素中某些元素不匹配,丟擲IllegalArgumentException。
    List<String> linkedList = new LinkedList<>(arrayList);
    for(int i =0;i<100;i++){
       linkedList.add("aaa"+i);
    }
    boolean isContains = linkedList.addAll(new ArrayList<String>());
    Log.w("列印"," "+isContains);
    
    如果新增之後集合沒有改變,返回false。
  11. boolean addAll(int index, Collection<? extends E> c);將指定集合中的所有元素插入到此集合中指定位置,指定位置如果本來有元素,則該位置元素和後續元素向右移動。如果操作後集合發生了改變,則返回true,否則返回false。規定A:如果此集合不支援addAll()方法,丟擲UnsupportedOperationException。規定B:如果指定集合中的元素型別和本集合型別不同,丟擲ClassCastException。規定C:如果本集合不允許null元素,指定集合中有null元素;或者指定元素為null,丟擲NullPointerException。規定D:如果元素中某些元素不匹配,丟擲IllegalArgumentException。規定E:如果index超出了範圍,丟擲異常IndexOutOfBoundsException。
  12. boolean removeAll(Collection<?> c);從此列表中刪除指定集合中包含的所有元素。如果操作之後集合發生改變,返回true,否則返回false。規定A:如果此集合不支援removeAll()方法,丟擲UnsupportedOperationException。規定B:如果指定元素型別和此集合元素型別有不相同的,丟擲ClassCastException。規定C:如果指定集合中有元素為null,並且此集合不允許存在null元素;或者指定集合為null,丟擲NullPointerException。
    List<String> arrayList = new ArrayList<>();
    arrayList.add("aaa"+99);
    List<String> linkedList = new LinkedList<>();
    for(int i =0;i<100;i++){
        linkedList.add("aaa"+i);
    }
    linkedList.add("aaa"+99);
    Log.w("列印"," "+linkedList.size());
    linkedList.removeAll(arrayList);
    Log.w("列印"," "+linkedList.size());
    
    列印結果為:
    W/列印:  101
    W/列印:  99
    
    由此可見,預設情況下刪除是刪除相同元素。
  13. boolean retainAll(Collection<?> c);刪除指定集合中不包含的元素。如果執行後發生了改變,則返回true,否則返回false。規定A:如果此集合不支援使用retainAll方法,丟擲UnsupportedOperationException。規定B:如果此集合中的元素和指定集合中的元素為不同型別,丟擲ClassCastException。規定C:如果指定集合為null,此集合不允許存在null元素;或者指定集合為null,則丟擲NullPointerException。規定D:如果元素中某些屬性不匹配,當丟擲IllegalArgumentException。規定E:如果index超出範圍,則丟擲IndexOutOfBoundsException。
    List<String> arrayList = new ArrayList<>();
    arrayList.add("aaa"+11);
    arrayList.add("aaa"+22);
    arrayList.add("aaa"+33);
    arrayList.add("aaa"+44);
    List<String> linkedList = new LinkedList<>();
    linkedList.add("aaa"+99);
    linkedList.add("aaa"+22);
    linkedList.add("aaa"+33);
    Log.w("列印"," "+linkedList.size());
    linkedList.retainAll(arrayList);
    Log.w("列印"," "+linkedList.size());
    
    這裡我們指定集合用arrayList,裡面包含4個元素,此集合用linkedList,裡面包含三個元素,然後用linkedList呼叫retainAll方法,傳入arrayList,看下列印結果。
    W/列印:  3
    W/列印:  2
    
    這裡可以看出來指定集合中的元素不一定都要在此集合中存在。
  14. default void replaceAll(UnaryOperator operator){},Default Methods是java8中引進的函式,預設可以不被實現。UnaryOperator是繼承Function的一個介面。此方法是把集合中每個元素都替換成operator運算之後的結果。規定A:如果此集合不可修改,或者無法替換元素,則丟擲UnsupportedOperationException。規定B:如果perator是null,或者perator返回的結果為null,但是集合不允許null元素,丟擲NullPointerException。
  15. default void sort(Comparator<? super E> c):根據指定的c引發的順序對此集合排序。規定A:此集合中所有元素必須使用指定的比較器比較。首先將此集合轉化為陣列,然後根據規則對集合排序,最後將排序後的集合迴圈輸出到集合中。規定B:如果c為null,則此集合中所有元素必須實現Comparable介面,並且元素的Comparable natureal ordering是可用的。規定C:此集合必須可修改,但無需調整大小。規定D:API>25的Android應用。規定E:如果列表中的元素沒有使用指定比較器,丟擲ClassCastException。規定F:如果集合的iterator不支援set操作,丟擲UnsupportedOperationException。規定G:如果比較器違反了comparator合約,丟擲IllegalArgumentException。
  16. void clear();移除所有元素,執行之後這個集合為empty。規定A:如果此集合不支援clear,丟擲UnsupportedOperationException。
  17. boolean equals(Object o);比較指定物件與此集合的想等姓。當且僅當指定物件也是list,並且兩個集合具有相同的大小以及集合中對應的元素都是equal。
  18. int hashCode();返回此集合的雜湊碼值。
  19. E get(int index);返回指定位置的元素。規定A:如果index超出範圍,丟擲IndexOutOfBoundsException。
  20. E set(int index, E element);將指定位置替換成指定元素,返回被替換的元素。規定A:如果集合不支援set方法,丟擲UnsupportedOperationException。規定B:如果指定的元素型別不匹配,丟擲ClassCastException。規定C:如果指定的元素為null,並且集合中不允許null元素,丟擲NullPointerException。規定D:如果指定集合中的一些屬性不匹配,丟擲IllegalArgumentException。規定E:如果index超出範圍,丟擲IndexOutOfBoundsException。
  21. void add(int index, E element);將指定元素插入此集合的指定位置,並將原位置以及原位置之後位置的元素向右移動。規定A:如果此集合不支援add方法,丟擲UnsupportedOperationException。規定B:如果指定元素型別不匹配,丟擲ClassCastException。規定C:如果指定的元素為null,並且此集合不允許null元素,丟擲NullPointerException。規定D:如果指定元素中有屬性不匹配,則丟擲IllegalArgumentException。規定E:如果index超出範圍,丟擲IndexOutOfBoundsException。
  22. E remove(int index);移除指定位置的元素,並將後邊的元素向左移動,返回被移除的元素。規定A:如果此集合不支援remove方法,丟擲UnsupportedOperationException。規定B:如果index超出範圍,丟擲IndexOutOfBoundsException。
  23. int indexOf(Object o);返回集合中首次出現該元素的索引值,如果沒有匹配到,返回-1.規定A:如果指定元素與此集合型別不同,丟擲ClassCastException。規定B:如果指定的元素為null,並且此集合不允許null元素,丟擲NullPointerException。
  24. int lastIndexOf(Object o);返回指定元素最後一次出現的索引值,如果不包含此元素,則返回-1。規定A:如果指定元素型別和此集合型別不匹配,丟擲ClassCastException。規定B:如果指定元素為null並且此集合不允許null元素,丟擲NullPointerException。
  25. ListIterator listIterator();返回此集合的迭代器。
  26. ListIterator listIterator(int index);從列表的指定位置開始,返回列表中元素的迭代器,對於ListIterator來說,呼叫的是index-1。規定A:如果index超出範圍,丟擲IndexOutOfBoundsException。
  27. List subList(int fromIndex, int toIndex);返回fromIndex-toIndex之間資料的集合(左閉右開),返回的集合和原集合保持關聯性。下面做一個測試:
    List<String> linkedList = new LinkedList<>();
    for(int i =0;i<100;i++){
        linkedList.add("aaa"+i);
    }
    Log.w("列印"," "+linkedList.size());
    List<String> list = linkedList.subList(2,50);
    list.clear();
    Log.w("列印"," "+linkedList.size());
    
    列印輸出結果:
    W/列印:  100
    W/列印:  52
    
    由此可見,對截取出來的集合做的操作可以對映到原集合上,使用的時候慎重。
    規定A:如果fromIndex和toIndex超出範圍,丟擲IndexOutOfBoundsException。
  28. @Override
    default Spliterator spliterator() {
    return Spliterators.spliterator(this, Spliterator.ORDERED);
    }
    在此列表的元素上建立Spliterator。