java中String初始化的兩種方式,javastring初始化
字串可能是任何程式語言中都會出現的對象,java中建立並初始化一個String對象,最常見的方式有兩種:
String str=new String("XXX");
String str="XXX";
二者看似相同,其實有很大的差別。
前者是java中標準的對象建立方式,其建立的對象將直接放置到堆中,每調用一次就會建立一個新的對象;後者則會在棧中建立一個對象引用變數str,然後查看棧中是否存在"XXX",如果沒有,則將"XXX"存放進棧,並令引用變數str指向它;如果已經有"XXX",則直接令str指向它。這樣充分利用了棧的資料共用優點,當然也可能是一個陷阱,對象很有可能沒有建立,只不過指向一個先前已經建立的對象;而new()方法則能保證每次都建立一個新的對象。
下述代碼展示了二者的不同:
輸出結果:
true
false
教java中初始化字串變數String toConfession=""
表示的是一個Null 字元串,其實Java建立String變數有兩種方式,一種是你這種,直接用雙引號帶內容的方式,另一種是String str = new String("內容");
這兩種方式是有區別的,這涉及到池的概念,在java中有個常量池,通過第一種方式建立,那JVM會先去常量池裡面找有沒有你的內容,如果有的話,就直接指向那個內容所在位置,如:String str1 = "1"; 這種方式建立,常量池中已經存在了"1"這個常量,所以str1就直接指向了它;而第二種方式,通過new來建立的,String str2 = new String("1");這個時候雖然在常量池中已經存在了"1"這個常量,可是它還是會去堆中先執行個體化一個對象,然後對象指向常量池中的 "1";
總結:
第一種方式:若常量池有已經存在的對象,這種初始化方式不會建立對象(通常常量池會先執行個體化好1-128的整數)
第二種方式:就算常量池已存在對象,還是會在堆中new一個字串對象,然後指向常量池中的內容
java中,String類對象中的內容一旦被初始化就不可以再改變,那String類中還有replace與toUpperCase方法
朋友,你好,對於你的問題,我覺得下面的回答您會滿意明了:
String類對象中的內容一旦被初始化就不能再改變 沒錯的,這是String類的特性,一定要記住。
下面舉個例子:
String s = "Hello"; //這時候會在記憶體中開闢一塊空間儲存“Hello”,並且S的引用指向它;
s = “world”; //看這句,初學者一般覺得這樣的話s的值就變了啊,跟String的特性相違背了啊,其實並不然,s只是對象的引用,真正的對象存在了記憶體中,執行這句語句的時候,會在記憶體中重新開闢一塊記憶體,用來儲存“world”,並將原來的s引用指向“world”。但是原來的記憶體中的“hello”並沒有改變。也就是說String類對象中的內容一旦被初始化就不能再改變。
希望您會看明白。