JVM虚拟机之 new String(“abc“)到底创建几个对象/ Java中的字符串常量池详解

String str=new String("abc");
1:首先,我们看到这个代码中有一个new关键字,我们知道new指令是创建一个类的实例对象并完成加载初始化的,因此这个字符串对象是在运行期才能确定的,创建的字符串对象是在堆内存上。

2:其次,在String的构造方法中传递了一个字符串abc,由于这里的abc是被final修饰的属性,所以它是一个字符串常量。在首次构建这个对象时,JVM拿字面量"abc"去字符串常量池试图获取其对应String对象的引用。于是在堆中创建了一个"abc"的String对象,并将其引用保存到字符串常量池中,然后返回;

所以,这里正确的回答应该是:

1:如果abc这个字符串常量不存在,则创建两个对象,分别是abc这个字符串常量,以及new String这个实例对象。

2:如果abc这字符串常量存在,则只会创建一个对象。

Java中的字符串常量池(图解)_喃乔的博客-CSDN博客_java字符串常量池创建字符串对象有两种方式一种是通过初始化的方式创建String str="Hello";另一种是使用new关键字创建String str = new String("Hello");Java为了避免产生大量的字符串对象,设计了一个字符串池(String Pool),通过初始化方式创建的字符串对象都会存在于字符串池中,且字符串池中的字符串不会重复,以便可以被共享使用,提高存储效率。其工作原理是:当使用初始化的方式创建对象时,JVM会首先检查字符串池中是否存在值相等的字符串,如果存在,则不进行https://blog.csdn.net/qq_42391503/article/details/107779191详例+ 实解

String str1 = new String("Hello");①

String str2 = new String("Hello");②

String str3 = "Hello"; ③

String str4 = "Hello"; ④



System.out.println(str1 == str2); //false

System.out.println(str3 == str4); //true

System.out.println(str2 == str3); //false



System.out.println(str1.equals(str2)); //true

System.out.println(str3.equals(str4)); //true



String str5=str4;⑤

System.out.println(str4 == str5); //true



str5="World";⑥

System.out.println(str4);//Hello

System.out.println(str5);//World

 步骤一: 当代码运行到第①行后String str1 = new String("Hello");①

JVM首先会查找字符串池中是否存在值为“Hello”的对象,发现不存在,则在字符串池中创建一个“Hello”对象,在堆内存中也创建一个“Hello”对象,并将堆内存中的“Hello”对象的引用(内存地址)赋给变量str1,此时字符串在内存中的存储示意图如下:

JVM虚拟机之 new String(“abc“)到底创建几个对象/ Java中的字符串常量池详解_第1张图片

步骤二 : 当代码运行到第②行后String str1 = new String("Hello");①

JVM首先会查找字符串池中是否存在值为“Hello”的对象,发现存在,则只在堆内存中创建一个值为“Hello”的对象,此时字符串在内存中的存储示意图如下:

 JVM虚拟机之 new String(“abc“)到底创建几个对象/ Java中的字符串常量池详解_第2张图片

 步骤三 :当代码运行到第③行后,String str3 = "Hello"; ③

JVM首先会查找字符串池中是否存在值为“Hello”的对象,发现存在该对象,则将该对象的引用赋给变量str3,此时字符串在内存中的存储示意图如下:

JVM虚拟机之 new String(“abc“)到底创建几个对象/ Java中的字符串常量池详解_第3张图片

 步骤四 :当代码运行到第④行后,String str4 = "Hello"; ④

JVM会将“Hello”对象的引用赋给变量str4。

JVM虚拟机之 new String(“abc“)到底创建几个对象/ Java中的字符串常量池详解_第4张图片

步骤五 :当代码运行到第⑤行后,会将str4的引用赋给str5,String str5=str4;⑤

JVM虚拟机之 new String(“abc“)到底创建几个对象/ Java中的字符串常量池详解_第5张图片

 步骤六 :当代码运行到第⑥行后,str5="World";⑥

JVM会首先查找字符串池中是否存在值为“World”的对象,发现不存在,则创建一个“World”对象,并将该对象的引用赋给变量str5,此时字符串在内存中的存储示意图如下:

JVM虚拟机之 new String(“abc“)到底创建几个对象/ Java中的字符串常量池详解_第6张图片

总结 :

1:到此,str5的引用是对象“World”;str4和str3的引用是同一个对象“Hello”;str2和str1的引用是不同的对象“Hello”。 

2:Java为了避免产生大量的字符串对象,设计了一个字符串池(String Pool),通过初始化方式创建的字符串对象都会存在于字符串池中,且字符串池中的字符串不会重复,以便可以被共享使用,提高存储效率。

 

你可能感兴趣的:(#,Jvm,JVM)