先看乙個例子stringdemo2
public
class stringdemo2
}**執行結果:**
> false
> true
**詳解
1.首先,通過main()方法進棧。
2.然後再棧中定義乙個物件s1,去堆中開闢乙個記憶體空間,將記憶體空間的引用賦值給s1,「hello」是常量,然後去字串常量池 檢視是否有hello字串物件,沒有的話分配乙個空間存放hello,並且將其空間位址存入堆中new出來的空間中。
3.在棧中定義乙個物件s2,然後去字串常量池中檢視是否有」hello」字串物件,有,直接把」hello」的位址賦值給s2.
4.即s1中存的是堆中分配的空間,堆中分配的空間中存的是字串常量池中分配空間存放」hello」的空間的位址值。而s2中之間存的是字串常量池中分配空間存放」hello」的空間的位址值。
5.由於s1與s2中存放的位址不同,所以輸出false。因為,類string重寫了equals()方法,它比較的是引用型別的 的值是否相等,所以輸出true。即結果為false、true。
再看乙個例子stringdemo4
stringdemo4詳解
equals()比較方法不解釋,比較值,均相等,均為true。
1.s1與s2相加是先在字串常量池中開乙個空間,然後拼接,這個空間的位址就是s1與s2拼接後的位址。與s3的位址不同,所以輸出為false。
2.s3與」hello」+」world」作比較,」hello」+」world」先拼接成」helloworld」,然後再去字串常量池中找是否有」helloworld」,有,所以和s3共用乙個字串物件,則為true。
總結
1.string s = new string(「hello」)會建立2(1)個物件,string s = 「hello」建立1(0)個物件。
注:當字串常量池中有物件hello時括號內成立!
2.字串如果是變數相加,先開空間,在拼接。
3.字串如果是常量相加,是先加,然後在常量池找,如果有就直接返回,否則,就建立。
這是原文的鏈結位址
JVM字串常量池
stringtable intern 建立了幾個物件?string s newstring abc 2個。乙個在堆中,乙個在字串常量池中。string s1 newstring abc string s2 newstring abc 3個。字串常量池只會儲存乙份內容相同的字串。兩個在堆中,乙個在字串...
JVM 常量池 執行時常量池 字串常量池的理解
補充 答 常量池有class檔案的常量池 在檔案中 執行時常量池 記憶體中,由class檔案常量池得來 字串常量池是大的全域性字串快取池,公用。問 是的,那我這裡有點疑惑,就是這個helloword在編譯期的時候,是存於class的常量池中的,在class被載入後,存於記憶體中的執行時常量池,那麼,...
關於字串常量池的理解
1.記憶體區域 在棧中存放的是基本資料型別和引用資料型別 在堆中放的是物件的例項 在方法區中有一塊位址是常量池,常量池中用於存放字串常量 2.建立字串物件的兩種方式 string str1 hello string str2 hello string str3 newstring hello str...