直接赋值:String str = "字符串";只会开辟一块堆空间,并且会自动保存再对象池以供下次重复使用。
构造方法:String str = new String("字符串");会开辟两块堆内存空间,其中一块将成为垃圾,并且不会自动进入对象池,但是用户可以用intern()方法手动入池。
因为每个字符串都是String的一个匿名对象,所以首先会在堆内存开辟一个堆空间保存字符串保存hello,然后使用new关键字,开辟另外一块内存空间。因此真正使用的是用关键字new开辟的堆内存,而之前定义的字符串常量在堆内不会有任何的栈内存指向,江成为垃圾,等待GC回收,所以用构造方法开辟字符串对象实际上会开辟两块空间,其中一块成为垃圾。除了内存的浪费,由于关键字new永远表示开辟新的堆内存空间,所以不会保存在对象池中。不过可以手工入池,String str = new String("hello").intern() 。
在所有开发中,String对象的实例化永远都才用直接赋值的方式完成。