String s1 = new String(“abc”) 这段代码创建了几个字符串对象?

【博客园】String s=new String(“abc”)创建了几个对象?

字符串 "abc" 是一个对象
new String() 这里使用new又创建了一个对象
  1. 如果字符串常量池中不存在字符串对象“abc”的引⽤,那么会在堆中创建 2 个字符串对象“abc”。
  2. 如果字符串常量池中已存在字符串对象“abc”的引⽤,则只会在堆中创建 1 个字符串对象“abc”。

答案 : 会创建 1 或 2 个字符串对象


例题解析:

#创建了一个String对象
String str="abc";

#创建了一个String对象
String a="abc"; String b="abc";

#创建了三个String对象
String a="ab"+"cd";

在JAVA虚拟机(JVM)中存在着一个字符串池,其中保存着很多String对象,并且可以被共享使用,因此它提高了效率。

String a="abc",这行代码被执行的时候,JAVA虚拟机首先在字符串池中查找是否已经存在了值为”abc”的这么一个对象,它的判断依据是String类equals(Object obj)方法的返回值。
如果有,则不再创建新的对象,直接返回已存在对象的引用;
如果没有,则先创建这个对象,然后把它加入到字符串池中,再将它的引用返回。

哪些情况下可以加入字符串池?

只有使用引号包含文本的方式创建的String对象之间使用“+”连接产生的新对象才会被加入字符串池中。
对于所有包含new方式新建对象(包括null)的“+”连接表达式,它所产生的新对象都不会被加入字符串池

扩充知识点:

栈(stack):主要保存基本类型(或者叫内置类型)(char、byte、short、int、long、float、double、boolean)和对象的引用,数据可以共享,速度仅次于寄存器(register),快于堆。

堆(heap):用于存储对象。