學(xué)一門編程語言是進(jìn)入IT行業(yè)的法寶,很多人在明確了自己的興趣,明確了自己未來想從事的領(lǐng)域,明確了自己未來想成為一個什么樣的程序員后,選擇了學(xué)Java。
成都創(chuàng)新互聯(lián)專注于岱岳企業(yè)網(wǎng)站建設(shè),成都響應(yīng)式網(wǎng)站建設(shè),商城開發(fā)。岱岳網(wǎng)站建設(shè)公司,為岱岳等地區(qū)提供建站服務(wù)。全流程定制網(wǎng)站建設(shè),專業(yè)設(shè)計,全程項目跟蹤,成都創(chuàng)新互聯(lián)專業(yè)和態(tài)度為您提供的服務(wù)
不管學(xué)哪門編程語言,一定是要學(xué)會敲代碼的,這是你不可逃避的。
學(xué)Java,怎么寫出高質(zhì)量的Java代碼?java課程認(rèn)為這就是你得高度集中精力關(guān)心的問題。
怎么寫出高質(zhì)量的Java代碼?1、堅持沒有誰能夠隨隨便便就成功,也沒有誰能夠隨隨便便敲一手高質(zhì)量的Java代碼,就算你現(xiàn)在看著別人敲代碼怎么那么輕松,他們的輕松來源于堅持多次的練習(xí),你要是想讓自己的Java代碼變得高質(zhì)量,那么就離不開你長久的堅持,只有投入足夠多的時間,做出足夠的練習(xí),你才能夠獲得質(zhì)的飛躍。
2.專業(yè)Java專業(yè)知識是基本,好比蓋樓,地基不穩(wěn),怎么也蓋不出參天大樓。
Java代碼的敲寫,很多的時候,也是一樣的,你連最基礎(chǔ)的Java理論知識都沒有掌握好,然后就想跑在其他人的前面,敲出高質(zhì)量的Java代碼,那么簡直就是做夢。
起初,Java專業(yè)知識學(xué)起來是比較枯燥的,但是你必須要好好的去研究跟掌握。
3.模仿你是怎么開始進(jìn)入Java代碼的敲寫的,很多朋友回想一下,你是不是從模仿開始的,仿照其他人已經(jīng)寫好的代碼跟著寫一遍,寫兩遍,甚至是寫三遍。
模仿很重要,同時思考也很重要,熟練來源于練習(xí),做好和作對源于不斷的實踐,你要想敲出高質(zhì)量的Java代碼,那么你一定得好好研究怎么樣模仿的效果最好。
如何編寫高質(zhì)量代碼,從而提升系統(tǒng)性能。想必是很多程序員都非常注意的地方,最近總結(jié)了一些要點,特此記錄在案。 所謂代碼高可讀性和高可維護(hù)性,其實就是應(yīng)該有著規(guī)范的Java程序設(shè)計風(fēng)格,在開發(fā)程序過程中,從近期目標(biāo)看是應(yīng)該著眼于功能實現(xiàn),但是只能解一時之渴,而不思長遠(yuǎn)之計,確不可取,一個雜亂無序的代碼讓人看后有一種不解其意,心緒煩亂的感覺。所以,作為一名合格的程序員,一定要確定一個觀點就是你編寫出來的代碼不只是給你一個人看的,還是給別人看的,所以在開發(fā)過程中文件注釋頭,java源文件編排格式,方法體的具體業(yè)務(wù)含義的注釋都是必須的。 如程序注釋就分為塊注釋與行注釋 。例如塊注釋為
/**
* @param
@return
*/
行注釋
/** **/或者 //
再者就是方法的命名也需要多加斟酌,一個業(yè)務(wù)方法,如果取最能體現(xiàn)體現(xiàn)該業(yè)務(wù)的名字,這樣讀者幾乎不需要看代碼便可以知道該方法具體用途。 高質(zhì)量的代碼其實很多時候都在一些小細(xì)節(jié)中體現(xiàn),對于每個程序員來說一個for循環(huán)都會寫,可是卻有很多人沒有能在代碼中體現(xiàn)出高效性來,在這里我用簡單的一個例子來說明:一個ArrayList需要遍歷。 一般人會寫成for(int i=0;ilist.size();i++) 這有問題嗎?沒有問題,能夠完成程序員的意圖的功能。
可是它高效嗎?你有注意到這點嗎?其實問題就出現(xiàn)在list.size()方法,這個方法是計算一個list的大小,本身它不會存在任何問題,可是將它放在了一個for()循環(huán)中的話,就很有問題了,因為如果一個N次的for循環(huán),這個方法就需要被執(zhí)行N次,這樣的代碼就造成計算機(jī)花很多的時間去做沒有意義的事情,而本來這個list.size()方法只需要計算一次的就可以了,所以我們把計算list大小的方法放在for循環(huán)外面去定義的話,效率就可以得到提高
如: int size = list.size();
for(int i=0;isize;i++)
關(guān)于For循環(huán)還有一個要注意的地方,就是在for循環(huán)里面去New一個新對象。如:
for(int i=0;i10;i++){
A a = new A();
}
是不是怎么看都不會有問題,是的在語法上。或者是執(zhí)行業(yè)務(wù)處理邏輯的時候,它都是沒有任何問題的,可是這是從語言級別去看待問題,沒有深入到它的實現(xiàn)機(jī)制上去看待問題。
在介紹這個問題的之前我想先簡單說下關(guān)于java內(nèi)存的機(jī)制:java是如何在內(nèi)存中保存對象,我們回到A a=new A()在內(nèi)存中是怎么分配這個問題來,
首先在棧中開辟一段空間存放引用a,然后在堆中開辟一段空間存放新建的A對象,同時引用a指向堆中新建得A對象,a所指代的對象地址為A在堆中地址。根據(jù)javaGC機(jī)制,只有對象已經(jīng)沒有引用指向它的時候,才有可能被GC給回收,所以基于這種機(jī)制的話,上述的一個For循環(huán)就會存在很大的效率問題了,如果循環(huán)有1000次,在內(nèi)存中棧會有1000個引用,而堆中也會有1000個新生成的對象,同時1000個引用會相應(yīng)指向1000個新生成的對象,即使這個for循環(huán)結(jié)束,也不會有任何改變。但是實際上1000個引用的生成完全是沒有必要的,如果有著編寫高性能代碼的想法的話:像這樣的for循環(huán)完全可以這樣寫:
A a = null;
for(int i=0;i1000;i++){
a = new A();
...
}
這樣的代碼在內(nèi)存中便只會在棧中生成一個指向,每當(dāng)一個for循環(huán)結(jié)束后,這個指向會指向下一個新生成的對象,前面生成的對象就會失去指向,這樣GC就有可能更加快速的回收這些已經(jīng)失去功能的對象。 在java中其實new 一個對象是非常耗費時間的,特別是重量級對象,所以每次在new 對象的時候一定需要考慮清楚是不是非的生成一個對象才能完成我的業(yè)務(wù)需求呢?總之能夠根據(jù)實際情況,然后舉一反三的話,我相信大家編寫出來的代碼就會更加高效了。
其次是針對同步的慎重考慮,因為我們一旦用了synchronized這個關(guān)鍵字后,就很可能喪失了并行的功效,所以在開發(fā)的過程中需要注意到線程是不是會對共有的資源進(jìn)行處理,然后在慎重選擇Synchronized 關(guān)鍵字,其實大家可以考慮用ThreadLocal這個類,它的優(yōu)點是既保證同步的情況下仍然能保證并行,缺點是會占用更多的空間去換取換取時間。
最后,便是在j2ee開發(fā)過程中對數(shù)據(jù)庫操作的優(yōu)化,在這里我只針對代碼級別的優(yōu)化,關(guān)于數(shù)據(jù)庫級別的我不涉及。大家編寫SQL的時候會不會注意到一些原則,在這里我將羅列一些需要注意的要點。(總結(jié)肯定不會很全,我希望如果有大蝦能給予更多的經(jīng)驗指導(dǎo),在下將會感激萬分。)
(1)在搜索子句的列名邊要避免函數(shù)、算術(shù)操作符和其它的表達(dá)式,除非建立基于函數(shù)的索引
(2)使用復(fù)合索引的第一個列名
(3)SELECT子句中避免使用 ‘*’
(4)如果可能盡量多用"Commit"
(5)避免在索引列上使用IS null和Is not null
(6)用Union -all替換Union(如果可能的話)
(7)Oracel 采用自下而上的順序解析WHERE子句,可以過濾掉最大數(shù)量記錄的條件寫在WHERE子句的末尾
(8)between謂詞可以轉(zhuǎn)化為=and=子句,比如:price between 10 and 20
可以轉(zhuǎn)化為 price= 10 and =20
(9)like子句中匹配值的第一個字符是常量,也可以進(jìn)行轉(zhuǎn)換, 例如:
like “sm%”可以轉(zhuǎn)換成 =“sm” and “sn”
(10)在子查詢,exists和in要比not exists和not in執(zhí)行得快,因為對于exists和in,優(yōu)化器只要找到一條記錄就可以返回TRUE,而對于not exists和not in則必須檢查所有的值。
以上10條總結(jié)如果在編寫sql的時候能注意到的話,將會在一定程度上提高java跟數(shù)據(jù)交互的性能。
那么除了在SQL上下功夫來提高性能之外,編寫合適的事務(wù)處理也將帶來一些性能提高。我們都知道事務(wù)具有:原子性,隔離性,一致性,持久性,所以在使用事務(wù)的時候肯定是犧牲并發(fā)性能為代價的。特別是一個涉及update的事務(wù)處理的時候,數(shù)據(jù)庫會在表上加上排他鎖,而一個數(shù)據(jù)資源只要被一個事務(wù)放置了排他鎖,其他事務(wù)將不能放上排他鎖,一定要一直等到事務(wù)結(jié)束后才釋放。所以在這種情況下的,并發(fā)性就會被抹殺掉了。我們不能改變這種加鎖的機(jī)制,但是我們可以用另外一種方式來達(dá)到一定程度的性能提升,那就是根據(jù)實際情況將一個大事務(wù)分解成小事務(wù)來處理。簡而言之就是減低事務(wù)放置排他鎖和釋放排他鎖的時間間隔,這樣可以讓其他的事務(wù)能更快的訪問到數(shù)據(jù)資源。而關(guān)于大事務(wù)分解一定要小心使用,如果使用不恰當(dāng)?shù)脑捄芸赡軙a(chǎn)生意想不到的數(shù)據(jù)不一致錯誤。
比較Android上的Dalvik Java和Java SE
雖然遠(yuǎn)在Android出現(xiàn)之前,開發(fā)者就能用Java編程語言為移動設(shè)備編寫應(yīng)用程序,但它只是Java中功能極為有限的一個版本,稱為Java ME(微型版)。不同的移動設(shè)備還需編寫不同的代碼,因此,寫一個應(yīng)用程序就能在支持Java ME的任何手機(jī)上運行是幾乎不可能的。此外,由于當(dāng)時不存在很好的在線商店,應(yīng)用發(fā)布過程極其復(fù)雜。
Android的問世為開發(fā)者提供了構(gòu)建智能手機(jī)強(qiáng)大應(yīng)用的機(jī)會,開發(fā)者只需用Java編程語言以及他們熟知的標(biāo)準(zhǔn)Java API編寫代碼。然而,盡管Android開發(fā)者仍使用Java SE編譯器來編譯應(yīng)用程序,你會發(fā)現(xiàn),James Gosling開發(fā)的Java和Android設(shè)備上的Java存在許多不同之處。
在Android設(shè)備上運行的VM(虛擬機(jī))稱為Dalvik。它最初由谷歌的Dan Bornstein開發(fā),適用于CPU和內(nèi)存受限的移動設(shè)備。Java SE和Dalvik Java存在一些差異,主要體現(xiàn)在虛擬機(jī)上。Java SE使用了棧機(jī)設(shè)計,而Dalvik被設(shè)計成了基于寄存器的機(jī)器。Android SDK中有一個dx工具,它會把Java SE棧機(jī)器的字節(jié)碼轉(zhuǎn)換成基于寄存器的Dalvik機(jī)器字節(jié)碼,該轉(zhuǎn)換步驟由IDE自動完成。
基于棧的虛擬機(jī)和基于寄存器的虛擬機(jī)的定義以及差異將不列入討論范圍。由于歷史原因,Android使用基于寄存器的虛擬機(jī)。雖然基于寄存器的虛擬機(jī)最多可以比基于棧的虛擬機(jī)快32%,但這只限于執(zhí)行時解釋字節(jié)碼的虛擬機(jī)(也就是說,解釋型虛擬機(jī))。在Android 2.2版本(也稱為Froyo)之前,Dalvik虛擬機(jī)都是純解釋型的。Froyo版本引入了JIT編譯器(即時編譯),這是Java SE很早就有的一個優(yōu)勢。
JIT編譯,也稱為動態(tài)翻譯。它在執(zhí)行前把字節(jié)碼翻譯成本機(jī)代碼(如圖1所示),這樣主要有兩個好處。首先,它消除了那些純解釋型虛擬機(jī)的開銷;其次,它能對本機(jī)代碼執(zhí)行優(yōu)化,這通常是靜態(tài)編譯代碼無法做到的。例如,JIT編譯器可以在它運行的CPU上選擇最合適的優(yōu)化,也可以根據(jù)應(yīng)用程序的輸入來分析代碼是如何運行的,以便進(jìn)行下一步的優(yōu)化
張小喜告別996 實現(xiàn)高效編程 減少開發(fā)壓力 開啟Java高效編程之門(完整版高清視頻)百度網(wǎng)盤 ?
鏈接:
提取碼: aizj 復(fù)制這段內(nèi)容后打開百度網(wǎng)盤手機(jī)App,操作更方便哦? ?
若資源有問題歡迎追問~ ?