成人AV在线无码|婷婷五月激情色,|伊人加勒比二三四区|国产一区激情都市|亚洲AV无码电影|日av韩av无码|天堂在线亚洲Av|无码一区二区影院|成人无码毛片AV|超碰在线看中文字幕

對象存儲在堆還是棧 String存放在堆中還是棧中?

String存放在堆中還是棧中?問題中的String指的應(yīng)該是java中的String吧。這里給出的回答針對java。String是一個不可變的對象,在java中只能作為常量使用。java代碼中所有的

String存放在堆中還是棧中?

問題中的String指的應(yīng)該是java中的String吧。這里給出的回答針對java。

String是一個不可變的對象,在java中只能作為常量使用。java代碼中所有的顯式字符串,即直接寫出的那種字符串,例如"abc"都是String對象。String本身作為一個對象,必然是在堆上的,而String中的內(nèi)容char[] value 則是放在堆中的一個特殊區(qū)域中——常量區(qū)。

所以String本身是放在堆上,而根據(jù)垃圾回收情況,又可以分為新生代和老年代。如果這個String對象剛創(chuàng)建不久,則它一般位于堆的新生代,如果它創(chuàng)建之后存在了很長時間,則它很可能處于堆中的老年代。注意,String中的字符串內(nèi)容即字符數(shù)組value則位于堆中的常量區(qū)。

如果你先有一個字符數(shù)組,例如char[] arr { "a", "b", "c" },然后調(diào)用String s = new String(arr)創(chuàng)建的String,則字符數(shù)組不再是位于常量區(qū),而是跟其他對象一樣,位于堆上。注意,即使這個arr數(shù)組是在棧上分配的,這樣創(chuàng)建的String中的value依然是在堆上。如果你想把這個字符串放進(jìn)常量區(qū),可以調(diào)用String.intern。

棧上不會有對象,只會有基本變量和引用變量,所以String只可能位于堆上,不可能位于棧上。