java自制缓冲池_java String 缓冲池概念的举例说明
口試中常會碰到String對象構造的題目。例如String s= new String("a");創建了幾個對象。
下面根據代碼具體解釋一下各種String構造情況。
代碼如下:
public class TestConstructString {
public static void main(String args[])
{
String s1 = "a";
String s2 = "b";
String s3 = "ab";
String s4 = "ab";
System.out.println("s3==s4? "+ (s3==s4));
String s5 = "a"+"b";
System.out.println("s3==s5? "+ (s3==s5));
String s6 = s1+s2;
System.out.println("s3==s6? "+ (s3==s6));
String s7 = new String("ab");
System.out.println("s3==s7? "+ (s3==s7));
final String s8 = "a" ;
final String s9 = "b" ;
String s10 = s8 + s9;
System.out.println("s3==s10? "+ (s3==s10));
}
}
輸出結果為:
s3==s4? true
s3==s5? true
s3==s6? false
s3==s7? false
s3==s10? true
在解釋之前先對String做個簡單的先容。
百度百科:java中的字符串。 String類是不可變的,對String類的任何改變,都是返回一個新的String類對象。 String 對象是 System.Char 對象的有序集合,用于表示字符串。String 對象的值是該有序集合的內容,并且該值是不可變的。
特別留意:String類是不可變(final)的,對String類的任何改變,都是返回一個新的String類對象.這樣的話把String類的引用傳遞給一個方法,該方法對String的任何改變,對原引用指向的對象沒有任何影響,這一點和基本數據類型相似.
String池:String是不可改變的,為了進步效率Java引用了字符串池的概念,例如new String("abc");首先會在String池中創建一個對象“abc”由于有NEW的 存在所以會分配地址空間copyString池的內容。當出現的String對象在String池中不存在時即在String池中創建該對象。
s3與s4根據String的概念他們都指向了同一個緩沖池內的地址,所以結果為true
s3與s5由于相加的兩個為常量所以編譯器會把s5="a"+"b"優化為s5="ab"。所以結果也為true。
s3與s6由于是兩個變量的相加所以編譯器無法優化,s1+s2即等同于(new StringBuilder(String.valueOf(s1))).append(s2).toString(); 在運行時,會有新的String地址空間的分配,而不是指向緩沖池中的“ab”。所以結果false。
s3與s7,根據緩沖池的定義在new的時候實際會新分配地址空間,s7指向的是新分配的地址空間所以與緩沖池地址不同,所以為false
s3與s10,類似于s3與s5,由于是final類型編譯器進行了優化所以相同。
創建字符串的方式很多,回納起來有三類:
其一,使用new關鍵字創建字符串,比如String s1 = new String("abc");
其二,直接指定。比如String s2 = "abc";
其三,使用串聯天生新的字符串。比如String s3 = "ab" + "c";
String對象的創建
String對象的創建也很講究,關鍵是要明白其原理。
原理1:當使用任何方式來創建一個字符串對象s時,Java運行時(運行中JVM)會拿著這個X在String池中找是否存在內容相同的字符串對象,假如不存在,則在池中創建一個字符串s,否則,不在池中添加。
原理2:Java中,只要使用new關鍵字來創建對象,則一定會(在堆區或棧區)創建一個新的對象。
原理3:使用直接指定或者使用純字符串串聯來創建String對象,則僅僅會檢查維護String池中的字符串,池中沒有就在池中創建一個,有則罷了!但盡不會在堆棧區再往創建該String對象。
原理4:使用包含變量的表達式來創建String對象,則不僅會檢查維護String池,而且還會在堆棧區創建一個String對象。
另外,String的intern()方法是一個本地方法,定義為public native String intern(); intern()方法的價值在于讓開發者能將留意力集中到String池上。當調用 intern 方法時,假如池已經包含一個即是此 String 對象的字符串(該對象由 equals(Object) 方法確定),則返回池中的字符串。否則,將此 String 對象添加到池中,并且返回此 String 對象的引用。
最后,有幾點題目請大家留意:String a; 與String a=null在作為類變量時候是等價的,在局部變量則不同。null表示一個空引用,String a=null意思是在棧中聲明了a,但是這個a沒有指向任何地址。此時我們留意到String a 在棧中聲明了a,但是也沒有指向任何地址,但是java的語法檢查假如在局部變量中,String a;是不能直接使用的,String a=null中的這個a可以直接使用。
總之:
//情況一
String s1 = "s"; // 創建了一個對象;
//情況二
s1 = new String("s"); //創建了兩個對象
//情況三
String s2 = new String("a" + s1); //創建了三個對象
總結
以上是生活随笔為你收集整理的java自制缓冲池_java String 缓冲池概念的举例说明的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: java结构体构建学生 学号_易错题:
- 下一篇: 贪心问题JAVA_java背包问题(贪心