java集合學習筆記

1. 基本概念

java容器類類庫的用途是“保存對象”,可以分爲Collection和Map兩種體系
1.collection 一個獨立元素的序列,這些元素都服從一條或多條規則。Collection(可以有序/無序,可重複/不可重複 等,具體依據具體的子接口Set,List,Queue等)

  • List: 按照插入的順序保存元素,可重複的集合
    - ArrayList
    - LinkedList
  • Set元素無序,不可重複的集合
    • HashSet 使用相當複雜的方式存儲元素,是最快獲取元素的方式
    • TreeSet 按照比較結果的升序保存對象
    • LinkedHashSet 按照添加的順序保存對象
    • queue按照排隊規則來確定對象產生的順序(通常與它們被插入的順序相同)在一端插入元素,一端刪除元素

2.Map 一組成對的鍵值對對象,允許使用關鍵字查找值。
- HashMap最快的查找技術
- TreeMap 按照比較結果的升序存儲鍵
- LinkedHashMap 按照插入的順序保存鍵,同時保留HashMap的查找速度

collection 方法摘要

boolean add(E e) //確保此collection包含指定的元素
boolean addAll(Collection<? extends E>c) //將指定collection中的所有元素都添加到此collection中
void clear() //移除此collection中的所有元素
boolean contains(Object o)//如果此collection中包含指定元素,則返回true;根據元素所在類的equals()方法進行判斷,如果是自定義對象,重寫equals()方法
boolean containsAll(Collection<?> c)//如果此collection包含指定collection中的所有元素,則返回true;
boolean equals(Object o)//比較此collection與指定對象是否相等
boolean isEmpty() //若爲空,則返回true
boolean remove(Object o)
boolean removeAll(Collection<?> c) //從當前集合中刪除包含在參數中的元素,及差集
boolean retainAll(Collection<?> c)//僅保留此collection中那些也包含在指定collection中的元素;返回結果給當前集合。
Object[] toArray() 將集合轉化爲數組,返回包含此collection中所有元素的數組
<T> T[] toArray(T[] a) //返回包含此collection中所有元素的數組;返回數組的運行時類型與指定數組的運行時類型相同。

List中新增加的方法

void add(int index,Object element)//在指定的索引位置index添加元素element
Object get(int index)//獲取指定索引index的元素
boolean addAll(int index,Collection eles)
Object remove(int index)
Object set(int index,Object element) //設置指定索引位置的元素爲element
List subList(int fromIndex,int toIndex) 
int indexOf(Object obj)//返回Obj在集合中首次出現的位置。沒有的話,返回-1
int lastIndexOf(Object obj)//返回obj在集合中最後一次出現的位置。如果沒有的話,返回-1

2. 添加一組元素

public class AddingGroups {
    public static void main(String[] args){
        //Collection的構造器接受另一個Collection來將自己初始化
        //Arrays.aslist()方法接受一個數組或者逗號分隔元素列表,並將其轉換爲一個List
        Collection<Integer> collection=
          new ArrayList<Integer>(Arrays.asList(1,2,3,4,5));
        Integer[] moreInt={6,7,8,9};
        //Collection.addAll()只接受另一個Collection對象作爲參數
        collection.addAll(Arrays.asList(moreInt));
        //Collections.addAll()方法接收一個Collection對象,和數組或用對號分隔的列表,
        //將元素添加到Collection中
        Collections.addAll(collection, moreInt);
        Collections.addAll(collection, 10,11,12,13);
        List<Integer> lists=Arrays.asList(14,15,16);
        lists.set(0, 10);
        //運行時異常,Arrays.asList()的輸出,將其當做list,
        //但是在這種情況下,其底層表示是數組,不能改變尺寸的大小
        //lists.add(17);
    }
}

Arrays.asList()和Collections.addAll()方法使用可變參數列表;

3. Iterator

迭代器是一個對象,遍歷並選擇序列中的對象;常被稱爲“輕量級對象”,創建它的代價小;將遍歷序列的操作與序列底層的結構分離,統一了對容器的訪問方式;java中的Iterator 只能單向移動;迭代器指向的位置是元素之前的位置。
- 使用iterator()要求容器返回一個Iterator;
- next() 獲得序列中的下一個元素;輸出並下移
- hasNext()檢查是否還有元素;
- remove()將迭代器新近返回的元素刪除;
如果只是向前遍歷List,但是並不打算修改List對象本身,foreach語法會更加簡潔;

ListIterator

ListIterator沒有當前元素,它的光標位置始終位於調用previous()所返回的元素和調用next()所返回的元素之間

 void add(E e);//將指定的元素插入列表;
 boolean hasNext(),正向遍歷列表,若列表迭代器有多個元素,則返回true;
 boolean hasPrevious()// 逆向遍歷列表,若列表迭代器存在多個元素,則返回true;
 int nextIndex() //返回對 next 的後續調用所返回元素的索引;
 E previous() //返回列表的前一個元素
 int previousIndex() //返回對previous的後續調用所返回的元素索引;
 void remove() //從列表移除由next 或previous返回的最後一個元素;
 void set(E e) //用指定元素替換next或previous返回的最後一個元素;

remove()和set(Object) 方法不是根據光標位置定義的,而是根據對調用next()或pervious()所返回的最後一個元素的操作定義的。

兩者區別

  1. ListIterator實現了Iterator接口,幷包含其他的功能,如:增加元素、替換元素、獲取前一個和後一個元素及索引等
  2. Iterator可以用來遍歷Set和List集合,ListIterator只能用來遍歷List.
  3. 都可以實現刪除對象,但是ListIterator藉助set()方法實現對象的修改,Iterator不能修改;

4. LinkedList

LinkedList執行某些操作(List中間的插入和刪除操作)比ArrayList高效;

 boolean add(E e) //將指定的元素添加到此列表的結尾
 E element()  //獲取但不移除此列表的頭
 E get(int index) //返回此列表中指定位置處的元素
 boolean offer(E e) //將指定元素添加到列表的末尾
 E peek()  //獲取但不移除列表的頭
 E Poll()  //獲取並移除此列表的頭
 E remove() //獲取並移除此列表的頭(第一個元素)

getFirst()和element() 相同,若List爲空,則拋出NoSuchElementException。 peek()在列表爲空時返回null;

removeFirst和remove() 方法相同,在List爲空時拋出NoSuchElementException。 pool()在列表爲空時返回null;

import java.util.*;
/*
 * 創建一個空的LinkedList<Integer>,通過使用ListIterator,
 * 將若干個Integer插入到這個list中,總是在中間位置插入
 */
public class E14_MiddleInsertion {
    public static void main(String[] args){
        LinkedList<Integer> list=new LinkedList<>();
        ListIterator<Integer> iterator=list.listIterator();
        for(int i=1;i<=10;i++){
            iterator.add(i);
            if(i%2==0)
                iterator.previous();
        }
        System.out.print(list); 
    }
}

5. Stack

java.util中沒有任何公共的Stack接口
ArrayList實現自List接口(隊列結構),JDK沒有直接提供Stack結構的接口,JDK的java.util.Stack類是從Vector繼承而來,Vector已過時,主要用於容量增加算法和同步以及方法冗餘,同Stack、HashTable正在被淘汰,更明智的做法是用LinkedList取代Stack。

import java.util.LinkedList;

public class Stack<T> {
    private LinkedList<T> storage=new LinkedList<T>();
    public void push(T t){storage.addFirst(t);}
    public T peek(){return storage.getFirst();}
    public T pop(){return storage.removeFirst();}
    public boolean empty(){return storage.isEmpty();}
    public String toString(){return storage.toString();}
}

6. Set

不保存重複的元素,常用來查詢某個元素是否在set中

SortedSet 是一個接口,元素按照自然順序進行排序,或者根據在創建有序set時提供的Comparator進行排序。插入有序set的所有元素必須實現Comparable接口(或者被指定的比較器接受),並且,所有的這些元素都是可以相互比較的。
所有通用有序set實現類都應該提供4個“標準”構造方法:
1. void構造方法,創建一個空的有序set, 按照元素的自然順序進行排序;
2. 帶有一個Comparator類型參數的構造方法,它創建一個空的有序set,根據指定的比較器進行排序;
3. 帶有一個Collection類型參數的構造方法,創建一個新的有序set, 其元素與參數相同,按照元素的自然順序進行排序;
4. 帶有一個SortedSet類型參數的構造函數,創建一個新的有序set,其元素和排序方法與輸入的有序set相同,無法保證強制實施此建議,因爲接口不能包含構造方法;

HashSet : 通過使用散列法來存儲信息,元素並沒有以某種特定的順序存放;
LinkedHashSet: 使用鏈表來維護元素的插入順序,因爲查詢速度原因也使用了散列;
TreeSet: 元素存儲在紅黑樹存儲結構中,對象以升序存儲,訪問和遍歷的時間很快;

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