(原文發表于http://www.ondev.net/post/show/565,轉載請注明出處)
關于Java Collection Framework,你可能已經知道如下一些事實
- Vector是線程安全的,ArrayList不是
- ArrayList的讀操作比LinkedList快,LinkedList的append操作比ArrayList快
- Set中不可能有兩個相等的元素,也就是說,如果e1和e2都在同一個Set中,那么不可能有e1.equals(e2)
- HashMap是線程不安全的,HashTable是線程安全的
但是你可能還不知道或者不了解這些事情:
- LinkedList不是線程安全的
- 不管是在多線程還是單線程的環境下,ArrayList都要比Vector快很多倍
- Set中可以插入null,不過最多只會有一個
- HashMap中可以插入null,HashTable中不行
- TreeSet使用compareTo代替equals判斷是否兩個元素相等
- HashMap中的元素,無論是keySet還是valueSet,都不一定是按照插入時間先后排序的,HashSet也一樣
- 對于非線程安全的類,比如HashMap,ArrayList,TreeSet,可以使用Collections.synchronizedXXX方法(比如synchronizedSet,synchronizedList,synchronizedMap)
- 你可以使用Collections.unmodifiableList來構建出一個不能被修改的List
- 你可以使用Arrays.equals來判斷兩個數組是否相等
- WeakHashMap使用元素的引用而不是值作為key,也就是說必須在引用相同(a==b)的情況下才能找到相關的值
- 對于WeakHashMap,一旦引用失效,相應的值也就不存在了,比如下面一段代碼中:
- public ? class ?TestHashMap?{? ??
- ??
- ???? public ? static ?WeakHashMap?wHmp=? new ?WeakHashMap();? ??
- ???? ??
- ???? public ? static ? void ?main(String?args[]){? ??
- ???????String?s1?=? new ?String( "one" );? ??
- ???????wHmp.put(s1, new ?Integer( 1 ));? ??
- ???????addObject(wHmp);? ??
- ???????Set?setHmp=?wHmp.keySet();? ??
- ???????? ??
- ??????? for (Iterator?it=setHmp.iterator();it.hasNext();){? ??
- ??????????System.out.println(wHmp.get(it.next()));? ??
- ??????}? ??
- ???????? ??
- ???}? ??
- ???? ??
- ??? public ? static ? void ?addObject(WeakHashMap?wHmp){? ??
- ???????? ??
- ?????String?s2?=? new ?String( "two" );? ??
- ?????String?s3?=? new ?String( "three" );? ??
- ?????wHmp.put(s2, new ?Integer( 2 ));? ??
- ?????wHmp.put(s3, new ?Integer( 3 ));? ??
- ?????s2= null ;? ??
- ?????s3= null ;? ??
- ?????System.gc();? ??
- ???}? ??
- }???
最后打印出來的結果只有"one”