日韩无码专区无码一级三级片|91人人爱网站中日韩无码电影|厨房大战丰满熟妇|AV高清无码在线免费观看|另类AV日韩少妇熟女|中文日本大黄一级黄色片|色情在线视频免费|亚洲成人特黄a片|黄片wwwav色图欧美|欧亚乱色一区二区三区

RELATEED CONSULTING
相關(guān)咨詢
選擇下列產(chǎn)品馬上在線溝通
服務(wù)時(shí)間:8:30-17:00
你可能遇到了下面的問題
關(guān)閉右側(cè)工具欄

新聞中心

這里有您想知道的互聯(lián)網(wǎng)營銷解決方案
JavaString常用方法詳解

層介紹過“Java String的常用方法及使用注意事項(xiàng)”,本文首先講述了Java String的常用方法,用String 常量池問題的四個(gè)例子對String對象的intern方法理解和分析。

String中的final用法和理解

 
 
 
  1. final StringBuffer a = new StringBuffer("111");  
  2. final StringBuffer b = new StringBuffer("222");  
  3. a=b;//此句編譯不通過  
  4. final StringBuffer a = new StringBuffer("111");  
  5. a.append("222");//編譯通過  
  6.  

可見,final只對引用的"值"(即內(nèi)存地址)有效,它迫使引用只能指向初始指向的那個(gè)對象,改變它的指向會導(dǎo)致編譯期錯(cuò)誤。至于它所指向的對象的變化,final是不負(fù)責(zé)的。

String常量池問題的四個(gè)例子

下面是幾個(gè)常見例子的比較分析和理解:

 
 
 
  1. [1]  
  2. String a = "a1";   
  3. String b = "a" + 1;   
  4. System.out.println((a == b)); //result = true 
  5. String a = "atrue";   
  6. String b = "a" + "true";   
  7. System.out.println((a == b)); //result = true 
  8. String a = "a3.4";   
  9. String b = "a" + 3.4;   
  10. System.out.println((a == b)); //result = true 
  11.  

分析:JVM對于字符串常量的"+"號連接,將程序編譯期,JVM就將常量字符串的"+"連接優(yōu)化為連接后的值,拿"a" + 1來說,經(jīng)編譯器優(yōu)化后在class中就已經(jīng)是a1。在編譯期其字符串常量的值就確定下來,故上面程序最終的結(jié)果都為true。

 
 
 
  1. [2]  
  2. String a = "ab";   
  3. String bb = "b";   
  4. String b = "a" + bb;   
  5. System.out.println((a == b)); //result = false 
  6.  

分析:JVM對于字符串引用,由于在字符串的"+"連接中,有字符串引用存在,而引用的值在程序編譯期是無法確定的,即"a" + bb無法被編譯器優(yōu)化,只有在程序運(yùn)行期來動態(tài)分配并將連接后的新地址賦給b。所以上面程序的結(jié)果也就為false。

 
 
 
  1. [3]  
  2. String a = "ab";   
  3. final String bb = "b";   
  4. String b = "a" + bb;   
  5. System.out.println((a == b)); //result = true 
  6.  

分析:和[3]中唯一不同的是bb字符串加了final修飾,對于final修飾的變量,它在編譯時(shí)被解析為常量值的一個(gè)本地拷貝存儲到自己的常量池中或嵌入到它的字節(jié)碼流中。所以此時(shí)的"a" + bb和"a" + "b"效果是一樣的。故上面程序的結(jié)果為true。

 
 
 
  1. [4]  
  2. String a = "ab";   
  3. final String bb = getBB();   
  4. String b = "a" + bb;   
  5. System.out.println((a == b)); //result = false   
  6. private static String getBB() {  
  7. return "b";   
  8. }  
  9.  

分析:JVM對于字符串引用bb,它的值在編譯期無法確定,只有在程序運(yùn)行期調(diào)用方法后,將方法的返回值和"a"來動態(tài)連接并分配地址為b,故上面程序的結(jié)果為false。

通過上面4個(gè)例子可以得出得知:

 
 
 
  1. String  s  =  "a" + "b" + "c";     
  2.  

就等價(jià)于String s = "abc";

 
 
 
  1. String  a  =  "a";     
  2. String  b  =  "b";     
  3. String  c  =  "c";     
  4. String  s  =   a  +  b  +  c;    
  5.  

這個(gè)就不一樣了,最終結(jié)果等于:

 
 
 
  1. StringBuffer temp = new StringBuffer();     
  2. temp.append(a).append(b).append(c);     
  3. String s = temp.toString();  
  4.  

由上面的分析結(jié)果,可就不難推斷出String 采用連接運(yùn)算符(+)效率低下原因分析,形如這樣的代碼:

 
 
 
  1. public class Test {  
  2. public static void main(String args[]) {  
  3. String s = null;  
  4. for(int i = 0; i < 100; i++) {  
  5. s += "a";  
  6. }  
  7. }  
  8. }  
  9.  

每做一次 + 就產(chǎn)生個(gè)StringBuilder對象,然后append后就扔掉。下次循環(huán)再到達(dá)時(shí)重新產(chǎn)生個(gè)StringBuilder對象,然后 append 字符串,如此循環(huán)直至結(jié)束。 如果我們直接采用 StringBuilder 對象進(jìn)行 append 的話,我們可以節(jié)省 N - 1 次創(chuàng)建和銷毀對象的時(shí)間。所以對于在循環(huán)中要進(jìn)行字符串連接的應(yīng)用,一般都是用StringBuffer或StringBulider對象來進(jìn)行append操作。

String對象的intern方法理解和分析

 
 
 
  1. public class Test4 {  
  2. private static String a = "ab";   
  3. public static void main(String[] args){  
  4. String s1 = "a";  
  5. String s2 = "b";  
  6. String s = s1 + s2;  
  7. System.out.println(s == a);//false  
  8. System.out.println(s.intern() == a);//true    
  9. }  
  10. }  
  11.  

這里用到Java里面是一個(gè)常量池的問題。對于s1+s2操作,其實(shí)是在堆里面重新創(chuàng)建了一個(gè)新的對象,s保存的是這個(gè)新對象在堆空間的的內(nèi)容,所以s與a的值是不相等的。而當(dāng)調(diào)用s.intern()方法,卻可以返回s在常量池中的地址值,因?yàn)閍的值存儲在常量池中,故s.intern和a的值相等。


當(dāng)前文章:JavaString常用方法詳解
當(dāng)前網(wǎng)址:http://www.5511xx.com/article/dpspeio.html