string s = new string (「hello」); 與
string s2 = 「hello」; 建立的區別
對於string s2 = 「hello」; 現在棧中建立乙個
string
物件引用的變數
s,然後查詢
hello
字串是否被儲存在常量池中,如果沒有則會將」hello」放入常量池,最後s
將指向這個物件位址,如果已經存在於常量池,則在字串常量中找到該物件然後
s指向該物件 第一種特點是:
jvm會自動根據棧中資料的的實際情況來決定是否有必要建立新物件。
對於string s = new string (「hello」); 而言可以分為兩步
string object= 「hello」; 與
string s = new (object);
第一步參考上面的建立方式, 第二步由於
hello
已經建立並儲存到常量池,因此
jvm只會在堆中建立乙個
string
物件,其值共享棧中已有的值。
string類是不可改變的。
關於字串的拼接有如下幾種情況:
一:string a = "a1"; //編譯期已經確定的值
string a1 = "a"+1;//a1 不會建立新物件直接指向
a所指的
a1物件
system.out.println(a1);
system.out.println(a==a1);
分析:結果為true
,由於a1
的值在編譯期就確定,其會直接指向物件」a1」。
二:string b = "b1";
int bb = 1 ;
string b1 = "b"+bb;// 在編譯期無法確定值因為
bb是變數,只有到執行期才會確定值
system.out.println(b==b1);
分析:結果為false
,因為編譯其無法確定
b1的值,因為
bb是變數 三:
string c = "c1";
final int cc =1 ;
string c1 = "c"+cc; // 在編譯期是確定的因為cc用
final
修飾說明其是常量,因此
cc實質上已經用1代替
system.out.println(c==c1);
分析:結果為true cc
已經為常量,其值在編譯器已經確定。 四:
string d = "d1";
final int dd= getdd();//雖然dd用
final
修飾,但是由於其值是從方法中獲取的只能在執行期確定, 所以在編譯期仍然無法確定因此仍視為變數
string d1 = "d1"+dd;// 由於
dd的緣故因此
d1在編譯期仍無法確定
system.out.println(d1==d);
public static int getdd() {
return 1 ;
分析:結果為false
,由於dd
的值是從方法中獲取,方法的值只有在執行期才能獲得,因此編譯期仍然無法確定。
java string 常量池問題
字串相加,只要有變數參與的,那麼就不會使用常量池裡的字串引用。如果是string s3 ab string s5 a b 這種在相加過程中沒有變數參與的字串參加,會使用常量池。所以,s3 s5的值是true。反正別的不多說,具體看程式,看了下面的,那一切都懂了 基於jdk1.8 string s1 ...
java String型別總結
總結昨天遇到的乙個string型別的知識 在記錄題目之前先補充幾個知識點 1.string a abc 與string b new string abc 此時的變數a b兩個物件不相等。a b不成立 但是 a.equal b 成立 並且無論a,b的定義位置如何,都不會影響到該結論 2.string ...
java String 方法備忘
輸出bc substring int beginindex,int endindex sublen endindex beginindex 所得string的長度 new string value,beginindex,sublen 獲取string的方法 含頭不含尾,包含起始下標,不含結束下標 因...