(一)知识点String str=“i”与 String str=new String(“i”)一样吗?(二)结论不一样,使用String str="i",java虚拟机会把它分配到常量池中,而 String str=new String(“i”)创建了一个对象,会被分到堆内存中。(三)再多学一点Java为了避免产生大量的String对象,设计了一个字符串常量池。工作原理是这样的,创建一个字符串时,JVM首先为检查字符串常量池中是否有值相等的字符串,如果有,则不再创建,直接返回该字符串的引用地址,若没有,则创建,然后放到字符串常量池中,并返回新创建的字符串的引用地址。所以,当你创建一使用String str="i"创建一个字符串时,str指向的是常量池中的这个字段。String str=new String(“i”)使用的是标准的对象创建方式 一个对象创建时,在虚拟机中的执行过程如下:

Object obj = new Object()
Object obj会反映到java虚拟机栈的变量表中,作为一个引用类型数据出现,“new Object()”会反映到java堆中,在java堆上创建一个Object类型的实例数据值的结构化内存,这块内存的长度是不固定的。在java堆中还存放了了能查到此对象类型数据(对象类型、父类、接口、方法等)的地址信息,这些信息存放在方法区中。
简单来讲,String str=new String(“i”)把对象分到了堆内存中,String str="i"将对象分配到了字符串常量池中。