繁体   English   中英

在构造函数中传递的String文字在哪里,当我们创建新的String对象时存储

[英]Where is the String literal which was passed in the constructor, stored when we create a new String object

在Java中,当我们编写

String S1 = "TestString";
String S2 = "TestString";

然后与if(S1==S2) ,我们得到的布尔结果为true。 对此的解释是,字符串常量是在字符串池中创建的,因此它是S1和S2在此引用的相同的字符串常量。 另外,如果我们写类似

String S1 = new String("TestString");

String S2 = new String("TestString");

然后与if(S1==S2)进行比较,我们得到false。 原因是由于字符串文字是在堆中创建的,因此S1和S2的引用是不同的。

我的问题是,在构造函数中传递的字符串文字“ TestString”在哪里创建? 它与String常量/常量相同吗? 因此,应该像在情况1中那样在Pool中创建它吗? 如果是这样的话,当我们在上面的两个语句之后写一些东西时

String S3 = "TestString";

这不应创建新的String文字,并且比较if(S1==S3)应该为true,但为false。

所以我无法弄清楚在构造函数中传递的字符串文字在何时何地。

任何帮助将不胜感激。 谢谢

我的问题是,在构造函数中传递的字符串文字“ TestString”在哪里创建? 它与String常量/常量相同吗? 因此,应该像在情况1中那样在Pool中创建它吗?

正确,传递给构造函数调用new String("TestString")的常量字符串存储在字符串池中,就像在语句String S1 = "TestString"

String S1 = new String("TestString");

String S2 = new String("TestString");

String S3 = "TestString";

在这种情况下, S1==S3给出false,因为S3引用了由用于S1的构造函数的参数创建的字符串文字,而S1是不同的字符串(因为它是使用构造函数创建的)。

if(S1 == S2),我们得到假。

那是因为您有三个不同的字符串S1,S2和字符串文字。 S1和S2是String对象的副本,并且具有不同的引用。 因此,它们都不是彼此==

我的问题是,在构造函数中传递的字符串文字“ TestString”在哪里创建?

它是像所有其他对象一样在堆上创建的(自Java 6起)。它也已添加到String intern()池中,因此任何其他相同的String文字将是相同的对象。

它与String常量/常量相同吗?

具有相同内容的所有String文字将是相同的对象。

字符串S3 =“ TestString”; 这不应创建新的String文字

正确。 字符串文字已经创建。

比较if(S1 == S3)应该给我真

我不知道为什么。 S1是字符串文字的副本 ,而不是字符串文字本身。

但它给出了错误。

如预期的那样。

所以我无法弄清楚在构造函数中传递的字符串文字在何时何地。

在Java 7之前,String文字是在加载类时创建的,在Java 7+中是在首次使用时创建的。

如果S1和S3共享相同的字符串文字/常量

在Java 6之前,它们共享相同的基础char []。 从Java 7开始,情况并非如此。 String对象一直是并且将始终是不同的。

S1具有引用,即它存储实际存储常量“ TestString”的位置的内存地址

S1是副本,因此它存储字符串文字副本的引用。

我仍然有一个问题,尽管当我们明智地比较S1和S3参考时,为什么它们不相等(它们必须持有相同的内存地址)

它们具有不同的地址,这就是为什么==给出false的原因。

S1和S2都在堆栈上,它们包含从堆中引用的各个对象的地址值。 因此,S1和S2本身将占据不同的位置(地址)。

通常, S1S2具有不同的位置并指向不同的位置。 但是,当将代码上交到机器代码以使其实际运行时,可以对其进行优化,以使变量位于寄存器中,而不是堆栈中,并且任何未使用的变量都将被丢弃。 即可能没有对象存在。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM