關於字串常量池的理解

2021-10-03 04:43:23 字數 873 閱讀 8723

1.記憶體區域

在棧中存放的是基本資料型別和引用資料型別

在堆中放的是物件的例項

在方法區中有一塊位址是常量池,常量池中用於存放字串常量

2.建立字串物件的兩種方式

string str1=

"hello"

;string str2=

"hello"

;string str3=

newstring

("hello"

)

str1 == str2,結果是true; 而str1==str3結果為false;

原因是str1使用字串時虛擬機器首先會在常量池中查詢,若常量池中有hello,則使用,如果常量池中沒有hello,則建立乙個hello放入常量池中並使用;str2也是如此,會先在常量池中查詢,由於str1已經建立hello,所以str2直接指向常量池中的hello,因此,str1和str2指向的是同乙個hello,所以結果為true;

而str3是使用new關鍵字建立的,new關鍵字在堆區中分配了乙個記憶體空間,所以str3指向的是堆區中的hello,而堆區中的hello是引用常量池中的hello;由於str1指向的是常量池,而str3指向的是堆,所以結果為false;

3.string str=new string(「hello」);建立了多少個物件?

答案是乙個或兩個

首先,如果常量池中沒有hello,則會在常量池中建立hello物件,而new關鍵字又會在堆中建立乙個物件,然後str指向堆中的物件,所以建立了 2個物件+1個引用;

如果常量池中有hello,則只有堆中的物件,因此建立了 1個物件+1個引用;

jvm字串常量池的理解

先看乙個例子stringdemo2 public class stringdemo2 執行結果 false true 詳解 1.首先,通過main 方法進棧。2.然後再棧中定義乙個物件s1,去堆中開闢乙個記憶體空間,將記憶體空間的引用賦值給s1,hello 是常量,然後去字串常量池 檢視是否有hel...

字串常量池

string的不可變性。字串常量池是不會儲存相同內容的字串。xx stringtablesize設定stringtable的長度。jdk8最小值為1009 string的string pool是固定大小的hashtable 字串常量池在堆中。字串拼接操作 和 equals equals 對於obje...

字串常量池

string a hello string b hello string aa new string aa string bb new string bb 字串常量池在方法區中 其中 變數a jvm先到字串常量池中尋找如果沒有就在字串常量池中建立乙個字串hello,並且將該字串常量池的hello的記...