String str1="i"與 String str2=new String("i")是否一樣及常量池,堆和棧的瞭解

String str1="i"與 String str2=new String("i") 是不一樣的。

String str1="i" 中 str 指向的對象是 常量池中的 “i”

String str2=new String("i")  中 str 指向的是 堆中的 “i”

理解這一點需要我們瞭解常量池,堆和棧的區別,

常量池存放字符串常量和基本類型常量(public static final)。

棧:棧內存首先是一片內存區域,存儲的都是局部變量,凡是定義在方法中的都是局部變量(方法外的是全局變量),,變量有自己的作用域,一旦離開作用域,變量就會被釋放。棧內存的更新速度很快,因爲局部變量的生命週期都很短。

堆:存儲的是數組和對象(其實數組就是對象),凡是new建立的都是在堆中,堆中存放的都是實體(對象),如果一個指向實體的變量消失了,這個實體不會消失,還可以用,所以堆是不會隨時釋放的,但是棧不一樣,棧裏存放的都是單個變量,變量被釋放了,那就沒有了。堆裏的實體雖然不會被釋放,但是會被當成垃圾被Java垃圾回收機制回收

 

當String str1="i" 時,JVM首先在常量池中尋找是否存在 “i” 這個對象,如果不存在,則在常量池中創建一個"i" 對象,並返回給引用對象:我們在棧裏創建的 str1 變量。如果存在就直接將地址返回給引用

當String str2=new String("i")  時,會先去常量池中查找是否已經有了 “i” 對象,如果沒有則在常量池中創建一個此字符串對象,然後在堆中再創建一個常量池中此  “i”  對象的拷貝對象(如果常量池中有,就直接在堆中創建拷貝對象)。將這個堆中產生的對象返回給引用 str2。

有這樣一道面試題:String s = new String(“xyz”);產生幾個對象?

答:一個或兩個,如果常量池中原來有”xyz”,就是一個,沒有就是兩個。

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章