1. 程式人生 > >集合框架-List與Set

集合框架-List與Set

所有的集合框架並不存放真正的物件,而是持有物件的引用
List與Set都繼承自Collection
List的實現類:ArrayList,LinkList,Vector
Set的實現類:HashSet,LinkedHashSet,SortSet(介面),TreeSet(實現SortSet).
首先介紹一下Ordered與Sorted介面的區別
Ordered:按照某種後天規定的順序遍歷其中的所有元素,可以想成佇列,按照存入順序排隊。
Sorted:按照天然的順序進行排序,不受外界影響。即使你輸入的順序是亂序,儲存中都會以天然的順序排序。

列表 List

實現該介面的類均屬於Ordered型別。按照索引先後順序排列的。列表中的索引從0開始
常用方法:

boolean add(Object o)//將O新增到列表的尾部,成功返回true,反之則反

void add(int index,Object o)//在該索引位置新增O,索引原來物件依次後移

boolean addAll(Collection c)//將C列表中的所有元素新增到列表的尾部,成功返回true

boolean addAll(int index,Collection)//將C列表中的元素新增到列表索引位置index處,然後列表中原來的元素一次後移

boolean contains(Object o)//檢查列表中是否包含元素O,有返回true

boolean containsAll(Collection c)//測試列表中是否包含列表c中所有元素,有返回true
void clear()//該方法移除列表中所有元素 Object get(int index)//返回列表索引為index處的元素\ int indexOf(Object o)//返回列表中O的第一次出現的索引位置,不存在返回負數 int lastIndexOf(Object o)//返回列表中O最後一次出現的索引位置,不存在返回負數 boolean isEmpty()//判斷列表是否為空,空返回true Object remove(int index)//移除索引位置為index處的元素,並且返回出來,後面的元素依次前移 boolean removeAll(Collection c)//移除測試列表中在C列表中存在的元素,如果移除返回true
boolean retainAll(Collection c)//保留測試列表中在C中存在的元素,其他的全部移除,做一次交集,若有元素移除返回true Object set(int index,Object o)//將索引為index的元素替代為O,返回被替代的元素 List subList(int fromIndex,int toIndex)//返回一個新的列表,列表中的元素索引為測試列表下標中的[fromIndex,toIndex),左閉右開 int size()//返回列表的元素數 Object[] toArray()//將列表轉換為物件陣列 //列表轉換為陣列,這個不是列表中的方法 public static List asList(T a) //使用例項 String[] s ={"zhangsan","lisi","wangwu"} List l = Arrays.asList(s);

ArrayList:內部實現依賴陣列,對元素的隨機訪問效能很好,但是如果有大量的刪除,插入操作時並不合適。
構造方法:

public ArrayList()//構造一個空的,預設大小是10

public ArrayList(int initialCapacity)//同樣是空的,初始容量是initialCapacity

 public ArrayList(Collectio c)//將列表c中的元素初始化給新建的列表。

LinkedList:依靠雙鏈表實現的,與ArrayList優缺點剛好相反
構造方法:

public LinkedList()//構造空的物件
public LinkedList(Collection c)//將列表C中的元素初始化賦值給新建的列表

Vector:效能與ArrayList相似,但是它是同步的,多執行緒同步訪問的時候根據需求可以採用,但是會降低效能。

Set

List中可以存在重複的值,而Set中不允許重複值出現。
List中元素的順序是元素的新增順序,Set的元素沒有順序。
常用方法:與ArrayList類似,但是凡與index相關的都沒有,因為它是無序存放的,所以沒有索引

HashSet

既不是Ordered也不是Sorted,元素在其中的存放是完全無序的,HashSet儲存物件引用的是按照雜湊策略實現的,可以向其中新增null值,但是隻能一次.
在儲存自定義的類的物件的時候,要複寫public int hashCode()與public boolean equals()方法,保證儲存的資料唯一性。
建構函式

public HashSet()//空的HashSet物件,初始容量是16

public HashSet(int initialCapacity)//空的HashSet物件,初始容量是initialCapacity

public HashSet(Collection c)//將列表C中的元素初始化給新建的HashSet

LinkedHashSet
是Ordered的,採用雙鏈表實現,元素的儲存順序是元素的插入順序,其他與HashSet相同。建構函式也是類似,不過多介紹。

SortedSet
繼承Set,不但具有Set的所有方法,而且時一個Sorted型別的Set。實現該介面的類將按照元素天然順序自動排序,不管插入順序,最終都會按照天然順序。
常用方法

Object first()//返回SortedSet中的第一個元素

Object last()//返回SortedSet中的最後一個元素

SortedSet headSet(Object toElement)//返回一個小於指定元素的並且不包含該元素的SortedSet 

SortedSet tailSet(Object fromElement)//返回一個大於指定元素並且包含該元素的SortedSet 

SortedSet  subSet(Object fromElement, Object toElement)//返回一個包含起始元素到不包含結束元素的SortedSet 

TreeSet
實現SortedSet 介面,保持天然順序儲存
TreeSet沒有采用雜湊儲存策略,因此不會呼叫hashcode()方法,但是同樣不能有重複元素,採用compareTo方法替代equals方法。
TreeSet儲存方式按照紅黑樹的結構進行儲存,所以插入新的元素時不會與所有的元素進行比較
儲存自定義類的物件時,為了保證有序,必須複寫public int compareTo(Object o)方法。
自定義比較器,實現不同的排序方式

class a implements Comparator{
    public int compare(Object o1,Object o2){
        Student s1 = (Student)o1;
        Student s2 = (Student)o2;
        return s1.age-s2.age;//按學生年齡排序
    }
}
main(){
    TreeSet ts = new TreeSet(new a());
}

建構函式

public TreeSet()//構造一個空的TreeSet物件

public TreeSet(SortedSet S)//構造一個元素以S中元素為初始內容的TreeSet物件

public TreeSet(Collection c)//構造一個元素以c中元素為初始內容的TreeSet物件

public TreeSet(Comparator c)引數c作為比較器,構造具有比較器的空TreeSet物件

集合的遍歷

Iterator
對於List來說,可以利用元素的索引進行遍歷,然而Set是沒有的,此時需要迭代器實現遍歷,所有實現Collection的類都有一個名稱為iterator的方法來獲取迭代器
獲取迭代器方法

Collection cset = new TreeSet();
Collection clist = new ArrayList();

Iterator i1 = cset.iterator();
Iterator i2 = clist.iterator();

常用方法

boolean hasNext()//測試集合中是否還有沒有遍歷的元素,存在返回true

Object next()//該方法返回下一個將要遍歷的元素,通常與hasNext()連用,返回的物件是Object型別的引用,取出時需要自行強轉。

void remove()//將下一個要遍歷的元素移除。

for-each
for(<引用型別><引用變數> : <集合引用>){}

HashSet hs = new Hash(Collection c);
for(Object o : hs){
    String temp = (String)o;
}