1. 程式人生 > >java String類有關靜態變數,常量池,引用物件的問題

java String類有關靜態變數,常量池,引用物件的問題

java String類有關靜態常量,常量池,引用物件的問題

今天看到一個面試題,這讓我對String類和jvm執行資料有新的瞭解,題目如下:

static String str0="0123456789";
static String str1="0123456789";
String str2=str1.substring(5);
String str3=new String(str2);
String str4=new String(str3.toCharArray());
str0=null;

假定str0,…,str4後序程式碼都是隻讀引用。
Java 7中,以上述程式碼為基礎,在發生過一次FullGC後,上述程式碼在Heap空間(不包括PermGen)保留的字元數為()
5
10
15
20

一開始我以為是20,但後來查了一些資料後覺得應該是10,不知道對不對,但分析如下:
1.
static String str0=”0123456789”;
static String str1=”0123456789”;
這兩行程式碼是 靜態變數,靜態變數在執行時會存在於方法區(非堆),所以heap空間為0
2.
String str2=str1.substring(5);
這行程式碼會將字元中放入字元池中也就是常量池,執行時常量池是方法區的一部分。
3.
String str3=new String(str2);
這行程式碼是new 了一個新的物件,肯定在執行時是放在堆中的。就算賦的值是另一String.所以空間應該為5.
4.


String str4=new String(str3.toCharArray());
這也是啦。+5
5.
str0=null;
這行沒什麼說的了,是把靜態變數賦值為null,也沒有放在堆中啦。

得出這個結果,我首先是查了《深入理解Java虛擬機器 JVM高階特性與最佳實踐(高清完整版)》的第二章內容。如果有理解錯誤,請大神們指出。