jvm字串常量池的理解

2021-08-22 11:51:08 字數 1353 閱讀 4618

先看乙個例子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...