字符串在Java中的细微差别

字符串在Java中的细微差别,java,Java,第一个系统。输出。打印。。。;语句作为预期输出为true,但为什么第二个语句作为输出显示为false 我想知道哪个字符串是在池区域中创建的,哪个是在池的非池区域中创建的。使用.equals来比较字符串对象 致: 另一方面,在以下代码中: new StringBuffer(a).append(b) (loading String in the common pool) ==测试引用相等,而.equals测试值相等 仅当您保证两个对象将使用相同的对象时才使用== 有关更多信息: 它还链接到一篇关于字

第一个系统。输出。打印。。。;语句作为预期输出为true,但为什么第二个语句作为输出显示为false

我想知道哪个字符串是在池区域中创建的,哪个是在池的非池区域中创建的。

使用.equals来比较字符串对象

致:

另一方面,在以下代码中:

new StringBuffer(a).append(b) (loading String in the common pool)
==测试引用相等,而.equals测试值相等

仅当您保证两个对象将使用相同的对象时才使用==

有关更多信息:
它还链接到一篇关于字符串插入的文章,这是一种只存储每个不同字符串的一个副本的机制。

Java中的字符串文本被插入到缓存的字符串池中。文字是指当它们完全写在代码中时,周围都是文字

当可以在编译时计算案例连接中字符串文字的整个表达式时,此类字符串也会被插入

你在java和ja实习。编译器可能足够聪明,可以看到s3在声明+初始化之间不会改变,但它不会,因为它不是最终的

宣布s3为最终版本将导致第二个SOP为真。添加s4=s4.intern也将如此;打印前

编辑:你问s4=s4到底是什么。实习生:


s4.intern将查看缓存字符串池,并从池中返回等于s4的缓存字符串。然后再次将其分配给s4。因此:如果s4引用存在,它将使用缓存版本替换s4引用。[副作用:如果该字符串不在池中,则将添加该字符串,引用将保持不变]。

但是.equals只比较内容而不是引用。我想知道哪个字符串是在池区域中创建的,哪个是在池的非池区域中创建的。这并不能回答问题。@Xabster很遗憾,我无法删除一个可接受的答案,我不会剽窃你的答案。我的帖子是在OP发表评论之前写的。@Aamir如果答案不正确/什么不是你的问题,你为什么接受它?@Xabster为什么不接受?问题是,为什么s1==s4在OP澄清之前不是真的。对答案的评论并不重要。想为他做这件事吗?说字符串连接发生在编译时是正确的,但是当引用像我的第二个SOP中那样涉及时,这是一个运行时的情况,这就是为什么输出为false。我不能以足够的准确性进行评论,但是你可能有一点。编译器可能正在优化字符串连接,这样在第一种情况下,它将是同一个对象,而在第二种情况下,它不会
{
System.out.println(s1.equals(s2));
System.out.println(s1.equals(s4));
}
a + b (a, b type String)
new StringBuffer(a).append(b) (loading String in the common pool)
String s1 = "java";
String s2 = "ja" + "va";
// "ja" appends to "va". As the compiler optimization pass realizes
// that "ja" + "va" is literal "java", it burns down the two strings into
// the same literal as s1.

String s3 = "ja";
String s4 = s3 + "va";
// s3 appends to "va". As the compiler cannot effectively study the literal,
// It is allowed to be concatenated at run-time. This allows "java" to be
// created from the heap, instead of from the common pool.