日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

java代码优化_java代码之美(11)---java代码的优化

發(fā)布時間:2024/1/23 编程问答 45 豆豆
生活随笔 收集整理的這篇文章主要介紹了 java代码优化_java代码之美(11)---java代码的优化 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

java代碼的優(yōu)化

隨著自己做開發(fā)時間的增長,越來越理解雷布斯說的: 敲代碼要像寫詩一樣美。也能理解有一次面試官問我你對代碼有潔癖嗎?

一段好的代碼會讓人看就像詩一樣,也像一個干凈房間會讓人看去很舒服。

一段好的項目代碼我覺得可以用這三個維度去分析。1)性能 2)可擴(kuò)展性3)可讀性

有關(guān)代碼的規(guī)范早在很久就有阿里巴巴的java開發(fā)手冊,里面有非常多的規(guī)范。太多了,自己也沒完全記住,抽空也會時不時再去翻翻。

接下來就寫一些有關(guān)性能和可讀性一些習(xí)慣,不全以后想到什么會再補(bǔ)充進(jìn)來。

一、性能考慮

1、必須注意: 不對數(shù)據(jù)庫層做任何操作 如果業(yè)務(wù)的確需要,那也最好注解說明原因。

2、盡量減少對變量的重復(fù)計算。

在不做編譯優(yōu)化的情況下,在循環(huán)中,循環(huán)條件會被反復(fù)計算,如果不使用復(fù)雜表達(dá)式,而使循環(huán)條件值不變的話,程序?qū)\(yùn)行的更快。

for (int i = 0; i < list.size(); i++)

{...}

//建議修改成:

for (int i = 0, length = list.size(); i < length; i++)

{...}

這樣list.size()只會調(diào)用一次,減少性能消耗。

3、盡量采用懶加載的策略,即在需要的時候才創(chuàng)建。

這個習(xí)慣需要培養(yǎng),在寫邏輯的時候,尤其是創(chuàng)建對象的時候是否需要考慮懶加載。

例如:

A a = new A();

if (i == 1)

{

list.add(a);

}

//建議替換為:

if (i == 1)

{

A a = new A();

list.add(a);

}

4、字符串累加。

1)循環(huán)外: 字符串拼接可以直接使用String的+操作,沒有必要通過StringBuilder進(jìn)行append.

2)循環(huán)內(nèi): 好的做法是在循環(huán)外聲明StringBuilder對象,在循環(huán)內(nèi)進(jìn)行手動append。不論循環(huán)多少層都只有一個 StringBuilder對象。

反編譯出的字節(jié)碼文件顯示每次循環(huán)都會 new 出一個 StringBuilder 對象,然后進(jìn)行 append 操作,最后通過 toString 方法返回 String 對象,造成內(nèi)存資源浪費。

StringBuffer sb = new StringBuffer();

sb.append("a");

sb.append("b");

sb.append("c");

sb.append("d");

//不在循環(huán)體內(nèi)其實可以直接用加號,優(yōu)化后一行代碼:

String sb="a"+"b"+"c"+"d";

有關(guān)JDK不同版本對String拼接的優(yōu)化可以參考:jdk不同版本對String拼接的優(yōu)化分析

5、盡量避免使用split。

split由于支持正則表達(dá)式,所以效率比較低。

替代

String str1="a,b,c,d,,f,g";

//可以考慮使用apache的StringUtils.split(string,char)

List list = Arrays.asList(StringUtils.split(str1, ","));

//可以考慮guava工具

List list1=Splitter.on(",").splitToList(str1);

6、確定Stringbuffer的容量

Stringbuffer的構(gòu)造器會創(chuàng)建一個默認(rèn)大小(通常是16)的字符數(shù)組。在使用中,如果超出這個大小,就會重新分配內(nèi)存,創(chuàng)建一個更大的數(shù)組,并將原先的數(shù)組復(fù)制過來,再丟棄舊的數(shù)組。在大多數(shù)情況下,你可以在創(chuàng)建Stringbuffer的時候指定大小,這樣就避免了在容量不夠的時候自動增長,以提高性能。

例子:

Stringbuffer buffer = new Stringbuffer(); // violation

buffer.append ("hello");

//更正好:為stringbuffer提供寢大小。一般循環(huán)體內(nèi)使用都可以知道大小

Stringbuffer buffer = new Stringbuffer(max);

buffer.append ("hello");

7、使用工具類 Arrays.asList()把數(shù)組轉(zhuǎn)換成集合時,不能使用其修改集合相關(guān)的方 法。

它的 add/remove/clear 方法會拋出 UnsupportedOperationException 異常。

說明:asList 的返回對象是一個 Arrays 內(nèi)部類,并沒有實現(xiàn)集合的修改方法。Arrays.asList 體現(xiàn)的是適配器模式,只是轉(zhuǎn)換接口,后臺的數(shù)據(jù)仍是數(shù)組。

String[] str = new String[] { "a", "b" };

List list = Arrays.asList(str);

//第一種情況:list.add("c"); 運(yùn)行時異常。

//第二種情況:str[0]= "gujin"; 那么list.get(0)也會隨之修改。

8、查找數(shù)組元素,可以用Arrays.asList(T[] array).contains(T obj)

二、可讀性考慮

1、推薦盡量少用 else, if-else 的方式

可以考慮:

if(condition){

...

return obj; }

// 接著寫 else 的業(yè)務(wù)邏輯代碼;

說明:如果非得使用if()...else if()...else...方式表達(dá)邏輯,【強(qiáng)制】請勿超過3層,超過請使用策略設(shè)計模式。

正例:邏輯上超過 3 層的 if-else 代碼可以使用衛(wèi)語句,或者狀態(tài)模式來實現(xiàn)。

接下來抽空會寫一篇超過三層if-else更好的解決方案博客。

2、在 if/else/for/while/do 語句中必須使用大括號,即使只有一行代碼。

避免使用: if (condition) statements;

3、使用條件操作符替代"if (cond) return; else return;" 結(jié)構(gòu)。

//條件操作符更加的簡捷

if (isdone) {

return 0;

} else {

return 10;

}

//更正

return (isdone ? 0 : 10);

4、Object 的 equals 方法容易拋空指針異常,應(yīng)使用常量或確定有值的對象來調(diào)用 equals。

正例: "test".equals(object);

反例: object.equals("test");

說明:推薦使用java.util.Objects (JDK7引入的工具類)

5、不允許出現(xiàn)任何魔法值(即未經(jīng)定義的常量)直接出現(xiàn)在代碼中。

反例

String key="Id#taobao_"+tradeId;cache.put(key, value);

6、取反操作符(!)降低程序的可讀性,所以不要總是使用。

boolean method (boolean a, boolean b) {

if (!a)

return !a;

else

return !b;

}

7、注釋掉的代碼盡量要配合說明,而不是簡單的注釋掉。

代碼被注釋掉有兩種可能性:1)后續(xù)會恢復(fù)此段代碼邏輯。2)永久不用。前者如果沒 有備注信息,難以知曉注釋動機(jī)。后者建議直接刪掉(代碼倉庫保存了歷史代碼)。

8、特殊注釋標(biāo)記,請注明標(biāo)記人與標(biāo)記時間。

待辦事宜(TODO)😦 標(biāo)記人,標(biāo)記時間,[預(yù)計處理時間]) 表示需要實現(xiàn),但目前還未實現(xiàn)的功能。

錯誤不能工作(FIXME):(標(biāo)記人,標(biāo)記時間,[預(yù)計處理時間])在注釋中用 FIXME 標(biāo)記某代碼是錯誤的,而且不能工作,需要及時糾正的情況。

只要自己變優(yōu)秀了,其他的事情才會跟著好起來(少將1)

總結(jié)

以上是生活随笔為你收集整理的java代码优化_java代码之美(11)---java代码的优化的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。