008 String str="i"與 String str=new String(“i”)一樣嗎?(已更新)


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:引用類型,重寫前比較兩個對象地址值,重寫后比較屬性值。


免責聲明!

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



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