2008年7月12日 星期六

JAVA collection

Collection、Map、Set、SortedSet、 List、SortedMap皆為interface
其他的才是class

Collection:
collection下有list與set
Set只有unique的元素
List則可以重複
Collection內存的是Object,讀出來前要先轉型,所以才有generic這種東西

Map:
而Map則是有Set的Key與Collection的value的組合

Set:
有HashSet class
而HashSet下還有LinkedHashSet class,會照add順序排列
HashSet在加入物件時
會先檢查物件的hashCode()是否跟HashSet中的元素有一樣
若一樣,再檢查是否reference到同個物件
若不是,再檢查equals()是否為true

List:
List是有Ordered的,可允許重複元素,有index
下有ArrayList、LinkedList、Vector
ArrayList跟Vector都是Random Access的,差別Vector為thread safe版
LinkedList則是Insert快,是double linked list
List要用contain的話要覆寫equals()

Map:
有key與value,key是unique的,所以是set
Map下有HashMap、LinkedHashMap、HashTable
HashTable是thread safe版的Hash Map,且不允許null Key

equals() :
通常寫法:
1.用==來判斷是否指到同個物件
2.判斷是否同個class
3.把obj轉型為這個class
4.用成員函數是否相等來判斷
Reflexive: x.equals(x) is always true.
Symmetric: F x.equals(y) <-> y.equals(x)
Transitive: if both x.equals(y) and y.equals(z) are true, then x.equals(z) is true.
Consistent: 不管算幾次都是一樣結果
null comparison: For any non-null reference obj, obj.equals(null) is always false.




hashCode()
有覆寫equals()的話也請覆寫hashCode()
eauals()為true的話,hashCode()值一定要一樣
eauals()為false的話,hashCode()值不一定要不同
一般性的規定
Consistency during execution:
Object value equality implies hash value equality:
Object value inequality places no restrictions on the hash value:

SortedMap、SortedSet
只有TreeMap與TreeSet
Implementing Comparable interface的物件並覆寫 compareTo()才可以加進去
*若compareTo() return 0的話,add就沒有作用

PriorityQueue預設自然排序,poll會從head來poll

Collection裡面只能放物件,所以它的generics也只能放物件

HashSet s的元素若要sort,可以把s丟進TreeSet的constructor
s= new TreeSet(s);

沒有留言: