java String 連線問題

2021-07-07 09:53:54 字數 1640 閱讀 9896

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的方法 含頭不含尾,包含起始下標,不含結束下標 因...