99热99这里只有精品6国产,亚洲中文字幕在线天天更新,在线观看亚洲精品国产福利片 ,久久久久综合网

歡迎加入QQ討論群258996829
麥子學(xué)院 頭像
蘋果6袋
6
麥子學(xué)院

Java性能優(yōu)化之字符串優(yōu)化

發(fā)布時(shí)間:2016-08-29 21:15  回復(fù):0  查看:2317   最后回復(fù):2016-08-29 21:15  

最近一直在總結(jié)Java性能優(yōu)化的問(wèn)題,所以出了這個(gè)java學(xué)習(xí)教程,這篇文章主要就給大家講一下Java性能優(yōu)化字符串優(yōu)化。

 

1.String對(duì)象

String對(duì)象是java中重要的數(shù)據(jù)類型,在大部分情況下我們都會(huì)用到String對(duì)象。其實(shí)在Java語(yǔ)言中,其設(shè)計(jì)者也對(duì)String做了大量的優(yōu)化工作,這些也是String對(duì)象的特點(diǎn),它們就是:不變性,常量池優(yōu)化和String類的final定義。

 

1.1 不變性

String對(duì)象的狀態(tài)在其被創(chuàng)建之后就不在發(fā)生變化。為什么說(shuō)這點(diǎn)也是Java設(shè)計(jì)者所做的優(yōu)化,在java模式中,有一種模式叫不變模式,了解的童鞋也應(yīng)該知道不變模式的作用:在一個(gè)對(duì)象被多線程共享,而且被頻繁的訪問(wèn)時(shí),可以省略同步和鎖的時(shí)間,從而提高性能。而String的不變性,可泛化為不變模式。

 

1.2 常量池優(yōu)化

常量池優(yōu)化指的是什么呢?那就是當(dāng)兩個(gè)String對(duì)象擁有同一個(gè)值的時(shí)候,他們都只是引用了常量池中的同一個(gè)拷貝。所以當(dāng)程序中某個(gè)字符串頻繁出現(xiàn)時(shí),這個(gè)優(yōu)化技術(shù)就可以節(jié)省大幅度的內(nèi)存空間了。例如:

String s1  = "123";
String s2  = "123";
String s3 = new String("123");
System.out.println(s1==s2);      //true
System.out.println(s1==s3);      //false
System.out.println(s1==s3.intern());    //true

以上代碼中,s1s2引用的是相同的地址,故而第四行打印出的結(jié)果是true;s3雖然只與s1,s2相等,但是s3時(shí)通過(guò)new String("123")創(chuàng)建的,重新開辟了內(nèi)存空間,因引用的地址不同,所以第5行打印出false;intern方法返回的是String對(duì)象在常亮池中的引用,所以最后一行打印出true

 

1.3 final的定義

String類以final進(jìn)行了修飾,在系統(tǒng)中就不可能有String的子類,這一點(diǎn)也是出于對(duì)系統(tǒng)安全性的考慮。

 

2.字符串操作中的常見優(yōu)化方法

2.1 split()方法優(yōu)化

通常情況下,split()方法帶給我們很大的方便,但是其性能不是很好。建議結(jié)合使用indexOf()subString()方法進(jìn)行自定義拆分,這樣性能會(huì)有顯著的提高。

2.2 String常量的累加操作優(yōu)化方法

示例代碼:

String s = "";
long sBeginTime = System.currentTimeMillis();
for (int i = 0; i < 100000; i++) {
    s+="s";
}
long sEndTime = System.currentTimeMillis();
System.out.println("s拼接100000s耗時(shí): " + (sEndTime - sBeginTime) + "ms");
        
StringBuffer s1 = new StringBuffer();
long s1BeginTime = System.currentTimeMillis();
for (int i = 0; i < 100000; i++) {
    s1.append("s");
}
long s1EndTime = System.currentTimeMillis();
System.out.println("s1拼接100000s耗時(shí): " + (s1EndTime - s1BeginTime) + "ms");
        
StringBuilder s2 = new StringBuilder();
long s2BeginTime = System.currentTimeMillis();
for (int i = 0; i < 100000; i++) {
    s2.append("s");
}
long s2EndTime = System.currentTimeMillis();
System.out.println("s2拼接100000s耗時(shí): " + (s2EndTime - s2BeginTime) + "ms");

結(jié)果:
Java性能優(yōu)化之字符串優(yōu)化
Java性能優(yōu)化之字符串優(yōu)化

上例所示,使用+號(hào)拼接字符串,其效率明顯較低,而使用StringBufferStringBuilderappend()方法進(jìn)行拼接,效率是使用+號(hào)拼接方式的百倍甚至千倍,而StringBuffer的效率比StringBuilder低些,這是由于StringBuffer實(shí)現(xiàn)了線程安全,效率較低也是不可避免的。所以在字符串的累加操作中,建議結(jié)合線程問(wèn)題選擇,應(yīng)避免使用+號(hào)拼接字符串。

2.3 StringBufferStringBuilder的選擇
上例中也使用過(guò)StringBufferStringBuilder了,兩者只有線程安全方面的差別,所以呢,在無(wú)需考慮線程安全的情況下,建議使用性能相對(duì)較高的StringBuilder類,若系統(tǒng)要求線程安全,就選擇StringBuffer類。

2.4 基本數(shù)據(jù)類型轉(zhuǎn)化為String類型的優(yōu)化方案
示例代碼:

Integer num  = 0;
int loop = 100000;  // 將結(jié)果放大100000倍,以便于觀察結(jié)果
long beginTime = System.currentTimeMillis();
for (int i = 0; i < loop; i++) {
    String s = num+"";
}
long endTime = System.currentTimeMillis();
System.out.println("+\"\"的方式耗時(shí): " + (endTime - beginTime) + "ms");
        
        
beginTime = System.currentTimeMillis();
for (int i = 0; i < loop; i++) {
    String s = String.valueOf(num);
}
endTime = System.currentTimeMillis();
System.out.println("String.valueOf()的方式耗時(shí): " + (endTime - beginTime) + "ms");
        
beginTime = System.currentTimeMillis();
for (int i = 0; i < loop; i++) {
    String s = num.toString();
}
endTime = System.currentTimeMillis();
System.out.println("toString()的方式耗時(shí): " + (endTime - beginTime) + "ms");

以上示例中,String.valueOf()直接調(diào)用了底層的Integer.toString()方法,不過(guò)其中會(huì)先判空;+""StringBuilder實(shí)現(xiàn),先調(diào)用了append()方法,然后調(diào)用了toString()方法獲取字符串;num.toString()直接調(diào)用了Integer.toString()方法,所以效率是:num.toString()方法最快,其次是String.valueOf(num),最后是num+""的方式。以下是結(jié)果截圖:

Java性能優(yōu)化之字符串優(yōu)化

建議童鞋們避免使用+""的方式轉(zhuǎn)換,最好是使用基本數(shù)據(jù)類型自帶的toString()方法轉(zhuǎn)換。就先分享到這兒吧!!!

 

 

文章來(lái)自:Linux社區(qū)


您還未登錄,請(qǐng)先登錄

熱門帖子

最新帖子

?