『壹』 怎樣編寫高質量的java代碼
如何編寫高質量代碼,從而提升系統性能。想必是很多程序員都非常注意的地方,最近總結了一些要點,特此記錄在案。 所謂代碼高可讀性和高可維護性,其實就是應該有著規范的Java程序設計風格,在開發程序過程中,從近期目標看是應該著眼於功能實現,但是只能解一時之渴,而不思長遠之計,確不可取,一個雜亂無序的代碼讓人看後有一種不解其意,心緒煩亂的感覺。所以,作為一名合格的程序員,一定要確定一個觀點就是你編寫出來的代碼不只是給你一個人看的,還是給別人看的,所以在開發過程中文件注釋頭,java源文件編排格式,方法體的具體業務含義的注釋都是必須的。 如程序注釋就分為塊注釋與行注釋 。例如塊注釋為
/**
* @param
@return
*/
行注釋
/** **/或者 //
再者就是方法的命名也需要多加斟酌,一個業務方法,如果取最能體現體現該業務的名字,這樣讀者幾乎不需要看代碼便可以知道該方法具體用途。 高質量的代碼其實很多時候都在一些小細節中體現,對於每個程序員來說一個for循環都會寫,可是卻有很多人沒有能在代碼中體現出高效性來,在這里我用簡單的一個例子來說明:一個ArrayList需要遍歷。 一般人會寫成for(int i=0;i<list.size();i++) 這有問題嗎?沒有問題,能夠完成程序員的意圖的功能。
可是它高效嗎?你有注意到這點嗎?其實問題就出現在list.size()方法,這個方法是計算一個list的大小,本身它不會存在任何問題,可是將它放在了一個for()循環中的話,就很有問題了,因為如果一個N次的for循環,這個方法就需要被執行N次,這樣的代碼就造成計算機花很多的時間去做沒有意義的事情,而本來這個list.size()方法只需要計算一次的就可以了,所以我們把計算list大小的方法放在for循環外面去定義的話,效率就可以得到提高
如: int size = list.size();
for(int i=0;i<size;i++)
關於For循環還有一個要注意的地方,就是在for循環裡面去New一個新對象。如:
for(int i=0;i<10;i++){
A a = new A();
}
是不是怎麼看都不會有問題,是的在語法上。或者是執行業務處理邏輯的時候,它都是沒有任何問題的,可是這是從語言級別去看待問題,沒有深入到它的實現機制上去看待問題。
在介紹這個問題的之前我想先簡單說下關於java內存的機制:java是如何在內存中保存對象,我們回到A a=new A()在內存中是怎麼分配這個問題來,
首先在棧中開辟一段空間存放引用a,然後在堆中開辟一段空間存放新建的A對象,同時引用a指向堆中新建得A對象,a所指代的對象地址為A在堆中地址。根據javaGC機制,只有對象已經沒有引用指向它的時候,才有可能被GC給回收,所以基於這種機制的話,上述的一個For循環就會存在很大的效率問題了,如果循環有1000次,在內存中棧會有1000個引用,而堆中也會有1000個新生成的對象,同時1000個引用會相應指向1000個新生成的對象,即使這個for循環結束,也不會有任何改變。但是實際上1000個引用的生成完全是沒有必要的,如果有著編寫高性能代碼的想法的話:像這樣的for循環完全可以這樣寫:
A a = null;
for(int i=0;i<1000;i++){
a = new A();
...
}
這樣的代碼在內存中便只會在棧中生成一個指向,每當一個for循環結束後,這個指向會指向下一個新生成的對象,前面生成的對象就會失去指向,這樣GC就有可能更加快速的回收這些已經失去功能的對象。 在java中其實new 一個對象是非常耗費時間的,特別是重量級對象,所以每次在new 對象的時候一定需要考慮清楚是不是非的生成一個對象才能完成我的業務需求呢?總之能夠根據實際情況,然後舉一反三的話,我相信大家編寫出來的代碼就會更加高效了。
其次是針對同步的慎重考慮,因為我們一旦用了synchronized這個關鍵字後,就很可能喪失了並行的功效,所以在開發的過程中需要注意到線程是不是會對共有的資源進行處理,然後在慎重選擇Synchronized 關鍵字,其實大家可以考慮用ThreadLocal這個類,它的優點是既保證同步的情況下仍然能保證並行,缺點是會佔用更多的空間去換取換取時間。
最後,便是在j2ee開發過程中對資料庫操作的優化,在這里我只針對代碼級別的優化,關於資料庫級別的我不涉及。大家編寫SQL的時候會不會注意到一些原則,在這里我將羅列一些需要注意的要點。(總結肯定不會很全,我希望如果有大蝦能給予更多的經驗指導,在下將會感激萬分。)
(1)在搜索子句的列名邊要避免函數、算術操作符和其它的表達式,除非建立基於函數的索引
(2)使用復合索引的第一個列名
(3)SELECT子句中避免使用 『*』
(4)如果可能盡量多用"Commit"
(5)避免在索引列上使用IS null和Is not null
(6)用Union -all替換Union(如果可能的話)
(7)Oracel 採用自下而上的順序解析WHERE子句,可以過濾掉最大數量記錄的條件寫在WHERE子句的末尾
(8)between謂詞可以轉化為>=and<=子句,比如:price between 10 and 20
可以轉化為 price>= 10 and <=20
(9)like子句中匹配值的第一個字元是常量,也可以進行轉換, 例如:
like 「sm%」可以轉換成 >=「sm」 and <「sn」
(10)在子查詢,exists和in要比not exists和not in執行得快,因為對於exists和in,優化器只要找到一條記錄就可以返回TRUE,而對於not exists和not in則必須檢查所有的值。
以上10條總結如果在編寫sql的時候能注意到的話,將會在一定程度上提高java跟數據交互的性能。
那麼除了在SQL上下功夫來提高性能之外,編寫合適的事務處理也將帶來一些性能提高。我們都知道事務具有:原子性,隔離性,一致性,持久性,所以在使用事務的時候肯定是犧牲並發性能為代價的。特別是一個涉及update的事務處理的時候,資料庫會在表上加上排他鎖,而一個數據資源只要被一個事務放置了排他鎖,其他事務將不能放上排他鎖,一定要一直等到事務結束後才釋放。所以在這種情況下的,並發性就會被抹殺掉了。我們不能改變這種加鎖的機制,但是我們可以用另外一種方式來達到一定程度的性能提升,那就是根據實際情況將一個大事務分解成小事務來處理。簡而言之就是減低事務放置排他鎖和釋放排他鎖的時間間隔,這樣可以讓其他的事務能更快的訪問到數據資源。而關於大事務分解一定要小心使用,如果使用不恰當的話很可能會產生意想不到的數據不一致錯誤。
『貳』 湖北北大青鳥:學Java怎麼寫出高質量的代碼
學一門編程語言是進入IT行業的法寶,很多人在明確了自己的興趣,明確了自己未來想從事的領域,明確了自己未來想成為一個什麼樣的程序員後,選擇了學Java。
不管學哪門編程語言,一定是要學會敲代碼的,這是你不可逃避的。
學Java,怎麼寫出高質量的Java代碼?java課程http://www.kmbdqn.cn/認為這就是你得高度集中精力關心的問題。
怎麼寫出高質量的Java代碼?1、堅持沒有誰能夠隨隨便便就成功,也沒有誰能夠隨隨便便敲一手高質量的Java代碼,就算你現在看著別人敲代碼怎麼那麼輕松,他們的輕松來源於堅持多次的練習,你要是想讓自己的Java代碼變得高質量,那麼就離不開你長久的堅持,只有投入足夠多的時間,做出足夠的練習,你才能夠獲得質的飛躍。
2.專業Java專業知識是基本,好比蓋樓,地基不穩,怎麼也蓋不出參天大樓。
Java代碼的敲寫,很多的時候,也是一樣的,你連最基礎的Java理論知識都沒有掌握好,然後就想跑在其他人的前面,敲出高質量的Java代碼,那麼簡直就是做夢。
起初,Java專業知識學起來是比較枯燥的,但是你必須要好好的去研究跟掌握。
3.模仿你是怎麼開始進入Java代碼的敲寫的,很多朋友回想一下,你是不是從模仿開始的,仿照其他人已經寫好的代碼跟著寫一遍,寫兩遍,甚至是寫三遍。
模仿很重要,同時思考也很重要,熟練來源於練習,做好和作對源於不斷的實踐,你要想敲出高質量的Java代碼,那麼你一定得好好研究怎麼樣模仿的效果最好。