每天一个知识点(二)String str=“i”与 String str=new String(“i”)一样吗?

534 阅读1分钟

微信搜索《Java鱼仔》,每天一个知识点不错过

(一)每天一个知识点

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"将对象分配到了字符串常量池中。