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用的頻繁所以這里是特例,針對性的優化。