在Java中,`String s=“lol”`创建两个对象?

在Java中,`String s=“lol”`创建两个对象?,java,string,Java,String,我听说在执行String s=newstringlol;时会创建两个对象;。一个对象是为字符串常量池创建的,另一个是为堆上的s创建的 那么,当我们执行以下命令时,是否创建了两个对象?字符串s=lol;对象创建是否相同 编辑: 有多少个对象是由以下对象创建的: 字符串s1=新字符串1 有多少人: 字符串s2=lol2 否,字符串s=lol;,只创建一个对象。对于每个字符串文字,将创建一个字符串对象并将其放置在字符串池中。这里,s只是指集合字符串。当您说s=new Stringlol时,将创建并汇集

我听说在执行String s=newstringlol;时会创建两个对象;。一个对象是为字符串常量池创建的,另一个是为堆上的s创建的

那么,当我们执行以下命令时,是否创建了两个对象?字符串s=lol;对象创建是否相同

编辑:

有多少个对象是由以下对象创建的: 字符串s1=新字符串1

有多少人: 字符串s2=lol2

否,字符串s=lol;,只创建一个对象。对于每个字符串文字,将创建一个字符串对象并将其放置在字符串池中。这里,s只是指集合字符串。当您说s=new Stringlol时,将创建并汇集字符串文字,并将另一个字符串分配给s,这是一个不同但相等的字符串

更新

我忘记了字符串对象内部使用的char[]

创建了两个对象,一个是保存{'l','o','l}的char[],另一个是在内部引用它的String对象。它被关在游泳池里

String s2 = new String("lol");
创建了3个对象。首先,创建字符串文本:2个对象,保存{'l','o','l}的char[]和引用它的字符串对象。它像以前一样被关在绳子池里。然后,将创建分配给s2的新字符串对象:一个新字符串,但它引用与原始字符串相同的字符数组。两个字符串对象和一个char[]对象。StringString构造函数可以在原始字符串的数组长度大于其计数的情况下复制char[],但这里的情况似乎不是这样


lol是一个字符串文字-当您在代码中引用它时,您强制Java创建这个对象。您看到的第二个对象是使用新运算符显式调用String的构造函数时。将这些值赋给其他变量不会创建其他对象。

实际上,常量池中的lol是在任何类中加载该值的第一个字符串文字时创建的,可能是10分钟前加载的类。简单地将对象引用值赋给对象引用变量并不会创建任何对象。这与另一个问题有关:也不是。一个是文本值,一个是对象。@AlexJohnson-字符串文本是对象。@hotlick确实如此,这就是为什么,直到Java获得像C一样的空合并运算符??,expectedValue.EqualsSomeStringVariables可能是现实世界中非常有用的构造:实际上,如果前面引用lol的语句仍然在类中,则不会创建任何对象。在整个JVM中,文字值lol最多只有一个表示形式。@HotLicks我将这个问题解释为这两个语句是不同的示例,而不是同一个程序中的两行。您不会只得到一个,一个字符串包装一个字符[],因此可能有两个,或者没有。@PeterLawrey-字符串不一定要包装一个字符[]。好的,还有一个问题:为什么在字符串s2=new Stringlol;的情况下会创建两个字符串对象?应该注意的是,在JVM的生命周期中只创建了一个lol实例,而不管有多少类使用了多少次文本。然而,新字符串每次执行时都会创建一个新对象。
String s2 = new String("lol");