天天看點

學習心得(泛型、算法及其他)

     1.泛型:     J2SE自版本5.0之後,就加入了泛型。泛型使得開發過程更友善,代碼更清晰,設計上來講也使得軟體更安全。新特性實作泛型的方式大概有以下幾種。第一,類型參數。一般用<X>(X為大寫字母)表示,主要是為了區分類型參數與其他辨別符。第二,通配符。一般有<?>,<? extends X>,<? super X>幾種表示方法。當函數的傳回值依賴于類型參數時,建議使用類型參數<T>,否則應該使用通配符。(此建議來源于Java1.5泛型指南)。JDK集合類庫中,大多數都同時用到了參數類型和通配符。例如類庫中的Collection接口聲明如下: public interface Collection<E> extends Iterable<E> {

//此處省略部分代碼 boolean add(E e);

boolean containsAll(Collection<?> c);

boolean addAll(Collection<? extends E> c);

} 可以看到此處既用到了類型參數作為函數的參數,同時也用到了通配符。什麼時候用哪種方式的參數來實作泛化的目的,就需要仔細斟酌了。在這兒要主要說明<? extends X>和<? super X>的差別。extends表示該類型為X的子類,而super表示該類型為X的父類。在這兒需要注意, 因為泛型其實隻是在編譯器中實作的而虛拟機并不認識泛型類項,是以要在虛拟機中将泛型類型進行擦除。也就是說,在編譯階段使用泛型,運作階段取消泛型,即擦除。舉例說明: //類的繼承關系如下 class Life{} class Human extends Life{} class Man extends Human{} //聲明 List<? extends Human> extendsList; List<? super Human> superList; extendsList表示該清單為Human子類清單,而superList表示該清單為Human父類清單。其含義為,extendsList可以存放Human的子類對象,而superList可以存放父類為Human的對象。在實際使用時,extendsList.add(human)會導緻編譯錯誤,原因是該清單的聲明指定了繼承上限,而在執行個體化的時候,extendsList可能是Human的子類類型,增加的元素無法保證其就是泛化類型的子類。而superList.add(human)卻可以,因為它的聲明指定了繼承的下限,保證了該清單在執行個體化時,至少會存儲Human的子類或者是Human超類的子類,Human的子類當然可以add進去了。這兒在概念上很容易讓人誤解,理論知識讓人很難了解,通過大量的練習,就會在實踐中找到真知。     2.算法:     最近幫朋友做了一個小工具,在實作的時候,用到了兩個算法,并通過一些數學知識驗證了算法的正确性。看來數學對于計算機還是相當重要啊。

    算法一:要生成一個資料序列Xi,使得Xi屬于閉區間[a,b],資料序列總和為m,資料序列個數為n。

    實作:     1)首先判斷m*n是否屬于閉區間[an,bn],如果不屬于,則無法無法生成,總和已超出了理論值的範圍。     2)如果參數在理論值範圍之内,則可生成。首先,求出區間[a,b]的中間值,然後将其作為X1輸出,然後将中間值依次加1,減1,加2,減2,... ... 依次類推,直到生成的個數符合參數所給個數為止。此時由于中間值在計算時不一定為整數,是以存在一定的誤差,需要對生成的資料序列求和,和參數所給的m進行比較,看看內插補點為多少,再将這個內插補點的正負來決定将這個內插補點補齊到最小值還是最大值。

    3)輸出序列X1 ... Xn。

    驗證:

    根據上述實作可以看出,該資料序列為等差數列,規律明顯。可用公式遞推如下:

     (a+b)/2-n/2, ..., (a+b)/2-2, (a+b)/2-1, (a+b)/2,(a+b)/2+1,(a+b)/2+2,...,(a+b)/2+n/2。     假設Sn為該資料序列之和,不難看出Sn=(a+b)*n/2+1。此時隻需要證明該和介于a*n和b*n之間即a*n < (a+b)*n/2+1 < b*n。通過不等式的計算,a*n<Sn恒成立,而Sn<b*n在b-a>1時也恒成立。也就是說隻要所給參數a和b之間的內插補點大于1,即可生成滿足條件的資料序列而不會發生生成的資料序列中的某個值會超出這個範圍。     算法二:打亂一個數組中的資料。

    實作:

    1)初始化随機數發生器,将系統的目前精确時間作為種子進行初始化,保證每次生成的随機數各不一樣。

    2)假設數組的下标從0到SIZE,則順序周遊數組下标,每次都生成一個按系統精确時間為種子生成的随機數,保證該随機數介于0和SIZE之間,然後對目前周遊的數組索引i和剛才生成的随機數索引對應的元素進行内容置換。

    3)結束。

    3.MVC模式:

     最近開發的新工具中大量用到了此設計模式。基本設計思想是,将Model,View,Action以ID索引的方式配置到檔案中,程式内部調用時,從全局配置檔案中通過ID反射到對象,Action隻負責事件轉發,View隻負表界面構造,Model隻負責業務處理。這樣做的好處是代碼子產品結構比較清晰,實作可以做到靈活處理,可擴充性強。當然也存在一些缺點,比如使用反射降低了效率,同時這種配置方式也導緻了調用層次比較複雜,如果文檔不夠詳細,代碼跟蹤起來多有不便。     4.工作量評估:     正如開會時老大所說,體力勞動者可以很明确地計算出工作量來,比如建一所房子需要多少塊磚,每天能搬多少塊磚,大概需要多少天。而腦力勞動者就比較難了,做一個軟體,從需求,到設計,再到實作,驗證,這些階段都需要不停的去思考,時間真的很難估算。但作為有經驗的從業人員來講,這些能力都需要在日積月累的開發生涯中不斷地完善,最終達到接近理想的目标。這也是需要鍛煉和培養的一項工作能力。養成高效的工作習慣, 積極 樂觀的去完成自已的使命。

繼續閱讀