不一样。
前者可能新建了一个对象,也可能没有新建对象。后者因为new关键字,至少在内存中创建了一个对象,也可能新建了两个对象。
这些都取决于“i”是否在字符串常量池中。
String str1=“i”。
(1)JVM会先确定字符串常量池中是否存在"i"。如果存在,将str1指向”i“的地址。如果不存在,就在常量池中开辟空间存储“i”。
(2)之后再在栈中开辟名为str1的空间,存储“i”在常量池中的地址。
String str2=new String (“i”)
(1)JVM会先确定字符串常量池中是否存在"i"。如果存在,将str1指向”i“的地址。如果不存在,就在常量池中开辟空间存储“i”。
(2)在堆中新建一个对象,new String (“i”)。
(3)之后再在栈中开辟名为str2的空间,存储在堆中新建对象的地址。
也就是说,前者在初始化的时候可能创建了一个对象,也可能一个对象也没有创建;后者因为new关键字,至少在内存中创建了一个对象,也有可能是两个对象。
可以看一下:
类加载过程中java虚拟机的内存分析:类加载过程中java虚拟机的内存分析