第13課:對字串的處理 2011.7.25
接著上一課介紹String,進行了char和String的區分。
介紹了StringTohenizer的用法,以前我一般使用的是String[] str.split的方式,從C過來,比較習慣[]的數組方式。同樣適用單純分割,可以用於文本啊訊息的解析。預設是“ ”分割,如果需要使用其他的分割或者增加某些分割,可以在建構函式中指定,例如new StringTohenizer(str, ", ");,這裡表示使用空格和逗號作為分割。可以用hasMoreTokens()檢查,以及用nextToken()方法來擷取。
接著是一個奇技淫巧,字母的移位,可以向後移動,也可以向前移。如果想前遷移,可修訂為26-(-key % 26),其中key就是位移,向前位移3,key=-3。另一方面也就是我們程式需要注意的,key不僅僅可以為正,也可以為負,不僅在正負26範圍內,也可以在之外,key可以是任何整數,而不是人為的想當然只是某些值,這會導致程式是否正確運行。
第14課:記憶體 2011.7.26、27
介紹記憶體,這絕對是C程式員中痛苦的回憶,尤其在開發服務的時候,不要導致記憶體流失,不要忘了釋放內容。以前曾經有書說java沒有指標,其實每個對象都是指標,只是程式員無需關心回收記憶體,避免很多異常。
在java中,char佔2 bytes。
資料存放區有靜態變數,在調用程式的時候就已經分配。動態變數資料,儲存的方式成為HEAP,例如一個變數儲存在地址2000,那麼下一個變數儲存在2004,地址分配是不斷增加的。local變數資料,儲存的方式成為stack。例如一個變數儲存在地址FFFF,下一變數儲存在地址FFFC,地址是不斷減少。
Heap的地址在增加,stack的地址在減少,如果他們的地址空間重疊,就會出現崩潰。但是大部分的程式不需要考慮這個問題,因為記憶體足夠。只是如果伺服器是不簡單允許,必須要跟蹤這種情況,如果記憶體一直漲得不到收斂,就很麻煩了。
無論是Heap還是stack在分配的時候一個4bytes的overhead,例如一個method,有2個local變數,那麼先分別一個overhead,表示這個method,然後分配兩個變數的記憶體,如果其中一個變數是通過new來建立一個對象,在運行時,運行到new的時候,這就是一個動態變數,從heap中分配一個overhead,這個overhead的地址就是這個對象的地址,然後在heap中為這個對象分配記憶體。Object
o = new Object(......);通過這個"=",將對象的地址也就是指標的數值填入之前在stack中為這個變數分配的4 bytes中的記憶體中。
由於所需學習C,所以對java的記憶體配置還是很能理解,只是不知道分為heap和stack兩種存放方式。
第15課:指標要點回顧和檔案 2011.7.27
先繼續上一課對指標作進一步說明。對於primitive,也就是包括int,double,boolean,char這些,不是對象,所以記憶體中保持是當前的數值,如果作為method中的parameter,那麼就是給出一份copy。這點和對象傳遞指標有重大不同,copy一份指標,實際還是指向同一對象。
接著介紹檔案,通過類BufferReader去讀文本,通過類PrintWriter去寫文本。檔案處理完畢要記住close()。
介紹java的異常捕獲和處理。try{...}catch(IOException e1){}catch(Exception e2){},這是java比C/C++中更適合伺服器開發的方式,可以輕鬆處理你想到和你沒有想到的異常。Yeah,這確實是價值連城。try中的語句數量要少,對危險操作才進行catch,盡量不要將大量的處理統統扔進來,不過如果你感覺不可靠,都可以扔進來。catch我也經常喜歡用於調測,例如程式掛了的原因定位。可以throw一個異常,給調用者進行處理。
相關連結:我的與編程思想相關的文章