自拍偷在线精品自拍偷,亚洲欧美中文日韩v在线观看不卡

Java String常用方法詳解

開發(fā) 后端
本文首先講述了Java String的常用方法,詳解String中的final用法,用String常量池問題的四個(gè)例子對(duì)String對(duì)象的intern方法理解和分析。

51CTO層介紹過“Java String的常用方法及使用注意事項(xiàng)”,本文首先講述了Java String的常用方法,用String 常量池問題的四個(gè)例子對(duì)String對(duì)象的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只對(duì)引用的"值"(即內(nèi)存地址)有效,它迫使引用只能指向初始指向的那個(gè)對(duì)象,改變它的指向會(huì)導(dǎo)致編譯期錯(cuò)誤。至于它所指向的對(duì)象的變化,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對(duì)于字符串常量的"+"號(hào)連接,將程序編譯期,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對(duì)于字符串引用,由于在字符串的"+"連接中,有字符串引用存在,而引用的值在程序編譯期是無法確定的,即"a" + bb無法被編譯器優(yōu)化,只有在程序運(yùn)行期來動(dòng)態(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修飾,對(duì)于final修飾的變量,它在編譯時(shí)被解析為常量值的一個(gè)本地拷貝存儲(chǔ)到自己的常量池中或嵌入到它的字節(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對(duì)于字符串引用bb,它的值在編譯期無法確定,只有在程序運(yùn)行期調(diào)用方法后,將方法的返回值和"a"來動(dòng)態(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對(duì)象,然后append后就扔掉。下次循環(huán)再到達(dá)時(shí)重新產(chǎn)生個(gè)StringBuilder對(duì)象,然后 append 字符串,如此循環(huán)直至結(jié)束。 如果我們直接采用 StringBuilder 對(duì)象進(jìn)行 append 的話,我們可以節(jié)省 N - 1 次創(chuàng)建和銷毀對(duì)象的時(shí)間。所以對(duì)于在循環(huán)中要進(jìn)行字符串連接的應(yīng)用,一般都是用StringBuffer或StringBulider對(duì)象來進(jìn)行append操作。

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

責(zé)任編輯:佚名 來源: 博客園
相關(guān)推薦

2009-06-12 09:46:40

Java String

2009-08-27 18:04:01

c#擴(kuò)展方法string

2019-09-04 15:31:04

JVM內(nèi)存String

2024-03-05 18:29:54

JavaString字符串

2023-02-03 10:21:24

智能汽車

2009-08-19 14:40:57

C#操作注冊(cè)表常用方法

2021-09-12 07:30:10

配置

2021-11-23 15:36:30

鴻蒙HarmonyOS應(yīng)用

2020-12-08 10:27:04

數(shù)據(jù)分析技術(shù)IT

2010-05-27 11:12:10

SVN目錄結(jié)構(gòu)

2009-06-11 13:49:30

2023-12-14 07:36:16

Java并發(fā)原子類

2020-04-27 10:00:53

負(fù)載均衡互聯(lián)網(wǎng)架構(gòu)

2024-11-01 10:30:05

2010-09-16 15:33:48

Java環(huán)境變量

2010-01-28 13:43:48

Android啟動(dòng)Ja

2021-04-15 10:00:46

Java基礎(chǔ)ListJava開發(fā)

2021-04-12 10:02:02

JavaList集合

2009-06-02 14:15:44

myeclipse jmyeclipse設(shè)置

2009-08-31 14:56:32

C# Byte數(shù)組轉(zhuǎn)換
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)