Java中關於String的問題?

時間 2021-06-01 02:34:55

1樓:超級大地

Q1jvm執行記憶體分為五個部分,那字串常量池屬於哪個部分的?是屬於堆的一部分還是單獨的一部分記憶體區域?

字串常量池屬於方法區,準確的來說是方法區中的執行時常量池。方法區邏輯上是堆記憶體的一部分,例如我們常用的HotSpot虛擬機器就是將方法區劃為堆記憶體中的永久代,但是為了區分,主流還是要認為方法區確實是一種非堆的區域。

Q2假定常量池中沒有"zhihu"物件,那麼我 String name = "zhihu";會建立乙個"zhihu"物件,name引用存在於棧中,那"zhihu"物件存在於字串常量池中還是存在於堆記憶體中?

String

name

="zhihu"

;//物件存在字串常量池

String

name_1

=new

String

("zhihu"

);//物件存在堆記憶體中

String

name_2

=new

StringBuilder

("zhihu"

).toString

();//物件存在堆記憶體中

String

name_3

=new

StringBuilder

("zhi").(

"hu"

).toString

();//

物件存在堆記憶體中

Q3假定常量池中存在"zhihu"物件,那麼我String anotherName = new String("zhihu");在記憶體中又是怎麼分配的

假定常量池中存在"zhihu"物件,那麼"String anotherName = new String("zhihu");"在記憶體中仍然是正常分配在堆記憶體。有多少個"new String("zhihu")"就會在堆記憶體上分配多少個物件。

補充:String

name

="zhihu"

;//物件在常量池中

String

name_1

=new

String

("zhihu"

);//物件存在堆記憶體中

String

name_2

=new

StringBuilder

("zhihu"

).toString

();//物件存在堆記憶體中

String

name_3

=new

StringBuilder

("zhi").(

"hu"

).toString

();//物件存在堆記憶體中

System

.out

.println

(System

.identityHashCode

(name

));System

.out

.println

(System

.identityHashCode

(name_1

));System

.out

.println

(System

.identityHashCode

(name_2

));System

.out

.println

(System

.identityHashCode

(name_3

));觀察輸出:

2樓:陳焱焱

如果直接 String name = "zhihu",那麼先在字串池中新建乙個物件,name指向它

String anotherName = new String("zhihu");是在字串池中建「zhihu」物件,再在記憶體中建乙個String物件指向它,然後name再指向記憶體中的那個物件

在java中String類為什麼要設計成final?

Seven0007 內聯這個說法是正確的,final修飾的類,其方法也都是final,在jvm中會被內聯到呼叫他的方法中。final修飾的類說白了就是不想讓你extends繼承,不想讓你重寫裡面的方法,或者自定義一些方法。所以說String沒有子類,沒有子類! 神的選項卡 那不是final,是imm...

Java求教!為什麼我用String類下的split方法拆分乙個字串時裡面的引數不能是File separator?

Mr.justin path.toString split Matcher.quoteReplacement File.separator BrandonYang 解決辦法如下,原因是符號 在regex裡面是轉義字元,而取file.separator在Windows環境下就是字串 String pa...

Java中this的問題

閣剛廣志 乙個解釋,細節不一定完全正確,但是可以解釋題主的問題 主要是看到眾多答主要麼過於簡略 要麼答非所問 要麼不能自圓其說 所以這裡我盡量說得形象清楚一些 首先main函式中的這句 Father obj new Son 先new了乙個Son物件。初始化過程是這樣的 因為Son的基類是Father...