Java中的字面常量(區別於final創建的有名常量)通常會保存在常量池中,常量池可以理解為像堆一樣的內存區域。但是常量池有一個特性就是,如果常量池中已存在該常量將不會再次為該常量開辟內存
還是看個程序:
package reverse; public class Reverse { public static void main(String[] args) { String s1="張漢青"; String s2="張漢青"; String s3=new String("張漢青"); System.out.println(""+(s1==s2)); System.out.println(""+(s1==s3)); System.out.println("-----------------------"); Integer I=Integer.valueOf(5); Integer J=Integer.valueOf(5); Integer Q=5; System.out.println(""+(I==J)); System.out.println(""+(J==Q)); System.out.println("-----------------------"); Integer k=Integer.valueOf(128); Integer g=Integer.valueOf(128); System.out.println(""+(k==g)); System.out.println("-----------------------"); Double d=12.5; Double e=12.5; System.out.println(""+(d==e)); } }
輸出結果為:
s1所引用的字符串對象是字面常量,會存儲在常量池,
s2所引用的字符串對象也是字面常量,而且常量“張漢青”在常量池中出現過,所以Java並不會為s2所引用的對象開辟新的內存而是讓s2直接引用之前存在的"張漢青"
內存中的模擬:
所以s1==s2為true;
s3是用new創建的,該對象的內存應該位於堆;
所以s1==s3為false
除了String類的字面常量會用到常量池,Java基礎類型的包裝類也會用到常量池,包括Byte,Short,Integer,Long,Character,Boolean;
所以I==J==Q為true
要注意Byte,Short,Integer,Long,Character這5種整型的包裝類也只是在對應值小於等於127時才可使用對象池,也即對象不負責創建和管理大於127的這些類的對象
所以k==g為false
另外double和float並沒有實現常量池技術。
所以d==e為false