java類庫的閱讀筆記_jdk1.7.0_40_java.util.Collections

2013 1021:

類:

java.util.Collections

方法:

public static <T extends Object & Comparable<? super T>> T min(Collection<? extends T> coll)

筆記:

這個泛型約束,加了一個extends Object,原因是兼容以前的方法。

在泛型引入之前,這個方法聲明是:public static Object min(Collection coll) 。也就是說,以前返回的類型是Object。所以爲了兼容性,引入泛型以後,這個方法也要返回Object類型。如果寫成<T extends Comparable<? super T>> ,那麼返回類型就是Comparable,不符合兼容性。

泛型規則:實際類型是聲明的第一個邊界類型,如果沒有聲明,那麼就是Object。比如 T extends A & B & C,那麼實際類型是A。

也就是說,泛型擦除這個東西,其實可以理解成,在class文件這個級別,只有實際類型,上面的聲明相當於:public static Object min(Collection coll)。而其他的約束,都是在編譯環節檢查的,利用反射,就可以完全繞過這些檢查。比如 test(List<? extends Object & String> list),完全可以反射,然後放入一個int值進去。

類:

java.util.Collections

方法:

private static <T> void rotate1(List<T> list, int distance)

筆記:

這個方法的實現很有意思。方法作用是把list所有元素順移distance個距離。假設一次for循環裏,起始位置爲p,distance爲d,list長度爲n。

那麼它的實現原理可以用下面兩點推導出來:

1、一次for循環內,不會重複設置某個點。因爲如果有重複設置某個點,那麼往回退得話,肯定會重複起始點p,這個終止條件矛盾。

2、一次for循環內,會在圈上設置一個週期小於n的點陣。證明:假設距離p點最近的點爲p+x,那麼下一個點必然是p+2x(或者取%n,以下都省略%n說明),因爲以p爲起點和以p+x爲起點,所有條件都是一樣的。

想明白原理以後,評估下方法的效率,果然是既省時間,又省空間。

類:

java.util.Collections

方法:

private static void rotate2(List<?> list, int distance) 

筆記:

長鏈表上面的移位,rotate1已經不適用了,因爲get和set操作取元素的耗時很高。這個方法的原理很簡單,就是兩部分逆序,然後整體逆序。但是想到這個辦法就真不簡單了。同樣是時空便宜。

類:

java.util.Collections

方法:

public static int indexOfSubList(List<?> source, List<?> target)

筆記:

這個方法裏面,用了continue tagName;這樣的語法來跳到外層繼續循環。

tagName:

for (int i = 0; i < 10; i++) {

for (int j = 0; j < 10; j++) {

if (j > 4) {

continue tagName;

}

}

}

換成break的話,也會跳出兩層循環,但是不會繼續外層循環。

類:

java.util.Collections

筆記:

這個類的Unmodifiable前綴方法名,比如UnmodifiableCollection,實現其實很簡單,就是新構造一個類,實現Collection接口,然後返回出去,新類裏面對傳入的Collection的方法進行包裝,任何包含修改動作的方法,都直接拋出異常,這樣就達到了Unmodifiable的效果。

同樣的,Synchronized前綴方法名,是內建一個同類型對象返回出去,這個新的對象,對各種方法進行封裝,任何真正調用原始數據的方法,都被synchronized關鍵字鎖住了。因爲這種非常簡單的實現,同步是效率比較低的,並且iterator方法無法進行保護。

同樣類型的方法系列,還有Checked前綴方法名,Empty前綴方法名,Singleton前綴方法名。

2013 1019:

類:
java.util.Collections
方法:
public static <T extends Comparable<? super T>> void sort(List<T> list)
筆記:
類型變量<T extends Comparable<? super T>>的意思是,傳入的類型T,需要實現Comparable接口,並且接口中的變量類型,需要是T或者T的父類。
比如這種類型是滿足T的類型約束的:
class A implements Comparable<Object> {
public int compareTo(Object obj) {
}
}
sort方法可以作用在A的List上:Collections.sort(new LinkedList<A>());

sort方法定義成這樣的好處是,T對象可以進行比較,並且T對象可以比較的對象,範圍很寬,只要是T的父類就可以了。

類:

java.util.Collections

方法:

private static <T> int iteratorBinarySearch(List<? extends Comparable<? super T>> list, T key)

筆記:

鏈表的二進制查找方法,這裏面比較特別的是,如何把每次迭代中,位於中間的對象取出來。它調用了取對象的方法

private static <T> T get(ListIterator<? extends T> i, int index)

這個方法,用迭代器的索引位置和index對比,不斷挪動迭代器的位置到index去,然後返回對象。

在iteratorBinarySearch方法中,迭代器i不是每次新生成的,而是每次二分查找的迭代中,用的都是同一個迭代器。所以迭代器的軌跡是每次二分中點的挪動軌跡。也就是說,迭代器最多挪動list的長度次。

對比最傻瓜式的取對象方法:list.get(mid) ,效率得到了保障。

類:

java.util.Collections

方法:

public static void reverse(List<?> list)

筆記:

ListIterator對於List來說非常實用,不要總是用Iterator這種通用的迭代器。


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