Java 字符串常量存放在堆內存還是JAVA方法區?


  JDK1.7 及之后版本的 JVM 已經將運行時常量池從方法區中移了出來,在 Java 堆(Heap)中開辟了一塊區域存放運行時常量池。

  JDK1.8開始,取消了Java方法區,取而代之的是位於直接內存的元空間(metaSpace)。

已知:

String A="abc";
String B="abc";
String C=new String("abc");
String D=new String("abc");

  比較A==B是否相等?

  比較C==D是否相等?
  分析:我們知道基本數據類型(int,byte,char...)這些是可以用==比較的,因為他們沒有地址,只有值。
但String是類,所以用==比較的時候,判斷的是地址是否相同,所以這里C和D是不等,他們是new出來的兩個完全不同的對象,僅僅是值相等,就像是兩個人僅僅是名字相同。
那么A==B嗎?
  A、B並不是通過new的方式創建的,所以他們的地址取決於后面所賦的值。Java中,普通字符串存儲在常量池中,常量池目前位於堆內存中,所以,從賦值方面來看,此時的A==B是成立的,比較的是常量池里的值。
總結:一般對於對象,比較值是否相等的時候,都是通過覆寫equals方法和hash方法來比較的,string用的頻繁所以這里是特例,針對性的優化。

 

 

 

轉載自:Java 字符串常量存放在堆內存還是JAVA方法區?


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM