java的堆和棧 String存放在堆中還是棧中?
String存放在堆中還是棧中?有問題的字符串應(yīng)該是指Java中的字符串。這里的答案是Java。字符串是一個(gè)不可變的對(duì)象,在Java中只能用作常量。Java代碼中的所有顯式字符串,即直接編寫的字符串,
String存放在堆中還是棧中?
有問題的字符串應(yīng)該是指Java中的字符串。這里的答案是Java。
字符串是一個(gè)不可變的對(duì)象,在Java中只能用作常量。Java代碼中的所有顯式字符串,即直接編寫的字符串,如“ABC”,都是字符串對(duì)象。字符串本身作為一個(gè)對(duì)象,必須在堆上,而字符串的內(nèi)容char[]value則放在堆常量區(qū)域的一個(gè)特殊區(qū)域中。
所以字符串本身就是放在堆上的,根據(jù)垃圾收集的情況,它可以分為新一代和老一代。如果字符串對(duì)象剛剛創(chuàng)建,它通常位于新一代堆中。如果已經(jīng)創(chuàng)建了很長(zhǎng)時(shí)間,很可能是在舊堆時(shí)代。請(qǐng)注意,字符串中的字符串內(nèi)容(即字符數(shù)組值)位于堆的常量區(qū)域中。如果首先有一個(gè)字符數(shù)組,例如char[]arr{“a”、“b”、“c”},然后調(diào)用String s=new String(arr)來創(chuàng)建該字符串,那么字符數(shù)組就不再位于常量區(qū)域,而是與堆上的其他對(duì)象類似。請(qǐng)注意,即使在堆棧上分配了ARR數(shù)組,以這種方式創(chuàng)建的字符串中的值仍在堆上。如果你想把這個(gè)字符串放在常量區(qū)域,你可以調(diào)用String.實(shí)習(xí)生.
堆棧上沒有對(duì)象,只有基本變量和引用變量,因此字符串只能在堆上,而不能在堆棧上。
在Java里堆內(nèi)存和棧內(nèi)存有什么區(qū)別?
這源于古老的C語(yǔ)言概念。函數(shù)中基本數(shù)據(jù)類型(字符串除外)應(yīng)用的所有局部變量,即函數(shù)退出時(shí)消失的變量,包括函數(shù)本身的參數(shù)定義,都使用堆棧內(nèi)存來構(gòu)造內(nèi)存。這樣做的目的是輸入函數(shù),將變量值放入堆棧,然后自動(dòng)從堆棧中退出函數(shù)。內(nèi)存應(yīng)用和回收將自動(dòng)完成。這些堆??臻g變量只能由函數(shù)本身引用,不能引用其他函數(shù)。
C語(yǔ)言的全局變量和Java的對(duì)象,即C語(yǔ)言的malloc()函數(shù)和C、Java新構(gòu)造的對(duì)象都在堆組織的內(nèi)存中,因此許多函數(shù)都可以引用這些存儲(chǔ)空間的值或?qū)ο?。存?chǔ)在堆空間中的對(duì)象和數(shù)據(jù)需要根據(jù)程序員的需要進(jìn)行釋放。例如,C語(yǔ)言使用free(),C語(yǔ)言使用析構(gòu)函數(shù),Java具有自動(dòng)循環(huán)機(jī)制。
隨便寫。如果你有任何錯(cuò)誤,不要噴。