无论是String还是new String最终都指向了String constant pool中,只不过是String直接指向了Stringconstant pool中。而new String是在Heap中创建了一个指向String constant pool中的引用。
java中,如果定义了String类型的字符串,最终的都存在String constant pool 中。
String constant pool就是jvm规范中所谓的方法区。
一个对象由对象头,对象实际数据,以及对齐填充(可能存在)三部分组成。
new一个对象会有两个东西占用内存,引用和实例。
new一个Object对象占用24个字节(64位) 或 12个字节(32位)
在JAVA虚拟机(JVM)中存在着一个字符串池,其中保存着很多String对象,并且可以被共享使用,因此它提高了效率。由于String类是final的,它的值一经创建就不可改变,因此不用担心String对象共享而带来程序的混乱。
String str = new String("abc"); 创建了几个对象?
一个或两个:abc 字符串之前没有用过,这毫无疑问创建了两个对象,一个是new String 创建的一个新的对象,一个是常量“abc”对象的内容创建出的一个新的String对象。
如果之前创建了‘abc’字符串,则只创建了一个对象。