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的記...