直接賦值:String str = "字符串";只會(huì)開辟一塊堆空間,并且會(huì)自動(dòng)保存再對(duì)象池以供下次重復(fù)使用。
構(gòu)造方法:String str = new String("字符串");會(huì)開辟兩塊堆內(nèi)存空間,其中一塊將成為垃圾,并且不會(huì)自動(dòng)進(jìn)入對(duì)象池,但是用戶可以用intern()方法手動(dòng)入池。

image.png
因?yàn)槊總€(gè)字符串都是String的一個(gè)匿名對(duì)象,所以首先會(huì)在堆內(nèi)存開辟一個(gè)堆空間保存字符串保存hello,然后使用new關(guān)鍵字,開辟另外一塊內(nèi)存空間。因此真正使用的是用關(guān)鍵字new開辟的堆內(nèi)存,而之前定義的字符串常量在堆內(nèi)不會(huì)有任何的棧內(nèi)存指向,江成為垃圾,等待GC回收,所以用構(gòu)造方法開辟字符串對(duì)象實(shí)際上會(huì)開辟兩塊空間,其中一塊成為垃圾。除了內(nèi)存的浪費(fèi),由于關(guān)鍵字new永遠(yuǎn)表示開辟新的堆內(nèi)存空間,所以不會(huì)保存在對(duì)象池中。不過可以手工入池,String str = new String("hello").intern() 。
在所有開發(fā)中,String對(duì)象的實(shí)例化永遠(yuǎn)都才用直接賦值的方式完成。