黑馬程序員——集合類

數組可以以組的形式管理對象,但是數組的長度固定,而且有時需要比數組更復雜的存儲方式,Java實例類庫提供了一套相對完整的容器類來解決此問題,這一套容器類叫做集合框架,其基本類型是List、Set和Map。它們有各自的特性,如Set每個值只能保存一個對象,Map允許以鍵值對的形式存儲對象。集合框架中的各類關係如下圖:

List和Set是Collection的子類。List已實現的子類:ArrayList、LinkedList和Vector;Set已實現的子類:HashSet和TreeSet。Map已實現的子類:HashMap、TreeMap和Hashtable。

List:

ArrayList:底層數據結構是數組,查詢速度快,增刪動作慢,元素的個數越多,其增刪越慢。
LinkedList:底層數據結構是鏈表,查詢速度慢,增刪動作快。
Vector:底層數據結構,線程同步,效率低。
每當需要增加長度時,ArrayList增長長度的50%,Vector增長長度的100%。
Vector特有方法:elements()獲取枚舉

Vector v=new Vector();
Enumeration en =v.elements();
While(en.hasMoreElements())
{
en.nextElement();
...
}

IO中有個類需要用枚舉。

LinkedList升級1.6後新增了方法:由原來的拋異常改爲返回null或false。
下面方法對,後面的是對前面方法的升級版。
方法對:addFirst——offerFirst(插入元素),getFirst——peekFirst(獲取元素),removeFirst——pollFirst(刪除元素並返回被刪除的元素)
 新返回值:                 false                                            null                                                           null
(...Last()方法一致。)

還有push()和pop()方法,LinkedList可以用作棧、隊列或雙端隊列。

Set:

Set:不可以重複元素
|--HashSet:數據結構是哈希表,線程是非同步的。
      保證元素唯一性的原理,判斷元素的hashCode值是否相同。
       如果相同,還會繼續判斷元素的equals方法,是否爲true。

|--TreeSet:可以對Set集合中元素進行排序。
       保證元素唯一性的依據,是compareTo方法return 0;
       讓元素自身具備比較性,元素需實現Comparable接口,此接口中有一個方法-compareTo()。這種方式也稱爲元素的自然順序。
       TreeSet底層實現是二叉樹。

HashSet:存儲數據時,先根據數據的hashCode值進行判斷,如果此值和現有的某個元素的hashCode值相同,就調用數據的equals方法,如果此方法結果爲0,則判定HashSet中已經有此元素,此數據不再存入。如果hashCode值不同,直接存入,不調用equals方法

hashCode()和equals()複寫:

public int hashCode()
{
…
}
public boolean equals(Object obj)
{
	If(!(obj instanceof XXX))
	return false;
	XXX x=(XXX)obj;
…
}

注意複寫時,equals方法的參數需要還是Object,一樣才叫複寫。

 TreeSet排序的第一種方式,讓元素自身具備比較性。元素需要實現Comparable接口,覆蓋compareTo方法。這種方式也稱爲自然順序,或者叫做默認順序。
 TreeSet排序的第二種方式。當元素自身不具備比較性,或者具備的比較性不是所需要的,這時就需要讓集合自身具備比較性,在集合一初始化時就具備比較性。
先定義一個比較器類,實現Comparator接口,實現其compare(Objecto1,Object o2)方法還有equals()方法(如果有equals()方法可以不用再實現),再將該比較器類對象傳入TreeSet構造方法。

Map:

  元素 構造方法 線程同步 備註
TreeMap 不可null 可null 鍵需實現Comparable接口的compareTo方法 可傳入構造器 非同步 構造器實現Comparator接口中的compare(T t1,T t2)和equals(Object o)
HashMap 可null 可null 鍵需實現hashCode()和equals()方法   非同步 由於鍵不可重複,HashMap中只能有一個null鍵
HashTable 不可null 不可null 鍵需實現hashCode()和equals()方法   同步  

TreeMap的鍵完全遵從TreeSet的存儲特性,HashMap的鍵完全遵從HashSet的特性。Map的值可以相同,還可以是null。

Map類添加鍵值對和刪除鍵值對用的方法是:
V put(K key,V value)                               // 如果Map中有key,則用新value替換舊值,返回舊值;如果Map中沒用key,則創建新鍵值對並返回null
V get(K key)                                             //如果Map中沒有key,則返回null

判斷Map中是否含有某鍵或某值:
boolean containsKey(Object key)
boolean containsValue(Object value)

由Map獲取其所有鍵對應的Set:
Set<K> keySet()

由Map獲取其所有鍵值對對應的Set,每個鍵值對被定義爲一個Map.Entry<Key,Value>泛型類:
Set<Map.Entry<Key,Value>>  entrySet()                      //獲得的Set中的元素是Map.Entry<Key,Value>類對象,Map.Entry<Key,Value>對象的方法有:
K getKey()
V getValue()
V setValue(V value)
boolean equals(Object obj)

集合框架類的通用方法:

void clear()
boolean isEmpty()
int size()


Iterator(迭代器):

Collection類對象都有迭代器,迭代器同意了對不同Collection類對象進行訪問的方式,Collection類對象的iterator()方法可獲得該對象的迭代器。
Iterator對象的方法:
boolean hasNext()
E next() // 其中E是該容器中存儲的類
void remove() //刪除剛由next()方法獲得的對象

ListIterator:

ListIterator是Iterator類型的一個子類,功能更強大,擴展的功能有:前向移動、添加、修改和返回當前位置前後的索引值。它只能用於List類的訪問。
ListIterator的方法:
void add(E e)
boolean hasNext()
boolean hasPrevious()
E next()
int nextIndex()
E previous()
int previousIndex()
void remove()
void set(E e)

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