String str="i"與 String str=new String(“i”)一樣嗎?(已更新)
答:不一樣。
因為內存的分配方式不一樣。String str="i"的方式,Java 虛擬機會將其分配到常量池中;而 String str=new String(“i”)方式,則會被分到堆內存中。
String str1 = "i";
String str2 = "i";
String str3 = new String("i");
System.out.println(str1 == str2);//ture
System.out.println(str2 == str3);//false
解釋:
1Java 虛擬機會將其分配到常量池中:常量池不會重復創建對象。
- 在String str1="i"中,把i值存在常量池,地址賦給str1。假設再寫一個String str2="i",則會把i的地址賦給str2,但是i對象不會重新創建,他們引用的是同一個地址值,共享同一個i內存。
2分到堆內存中:堆內存會創建新的對象。
- 假設再寫一個String str3=new String(“i”),則會創建一個新的i對象,然后將新對象的地址值賦給str3。雖然str3和str1的值相同但是地址值不同。
拓展:
-
堆內存用來存放由new創建的對象和數組。在堆中分配的內存,由Java虛擬機的自動垃圾回收器來管理。
-
常量池指的是在編譯期被確定,並被保存在已編譯的.class文件中的一些數據。
-
== :引用數據類型比較地址值;
-
equals:引用類型,重寫前比較兩個對象地址值,重寫后比較屬性值。