当前位置: 首页 > 知识库问答 >
问题:

为什么字符串池对于文字和变量的行为不同?

微生俊
2023-03-14

当我用运算符使用双引号,并与其他字符串文字值相同的结果为true...为什么会这样?

据我所知,当我们使用()操作符处理字符串时,JVM返回新的StringBuilder(字符串…)。toString(),它在堆内存中创建一个新的字符串实例,并在字符串池中创建一个引用。如果这是真的,那么它如何在一个场景中返回true,在另一个场景中返回false?

第一种情况:

    String string1 = "wel";
    String string2 = "come";
    string1 = string1 + string2; //welcome

    String string3 = "welcome";
    System.out.println(string3 == string1); // this returns false but have same hashcode

第二个场景:

    String string4 = "wel" + "come";
    String string5 = "wel" + "come";
    System.out.println(string4 == string5); // this returns true

有人能帮我吗?

共有2个答案

古刚洁
2023-03-14

根据我的知识,当我们用()运算符构造字符串时,JVM返回新的StringBuilder(string...)。toString()在堆内存中创建一个新的String实例

正确,除非两个操作数都是文本,在这种情况下,在编译时创建一个字符串常量并合并。

和字符串池中的一个引用。

错误的字符串池中只有字符串常量和String。intern()返回值。

如果那是真的

事实并非如此。

它是如何在一个场景中返回true而在另一个场景中返回false的?

因为你的前提是不正确的。

霍伟彦
2023-03-14

请关注评论。

 string1 = string1 + string2; //StringBuilder(string...).toString() which creates a new instance in heap..

 String string3 = "welcome"; // It is not in heap. 

所以string3==string1false

  String string4 = "wel" + "come"; //Evaluated at compile time

  String string5 = "wel" + "come"; //Evaluated at compile time and reffering to previous literal

所以string4==string5true

 类似资料:
  • 我的问题很简单。有什么区别-

  • 问题内容: 我不明白为什么这个简单的代码行不起作用: 它正在输出“ SomeVariable is $ someVariable”,而不是数字0。是否缺少某些内容或必须启用某些配置选项? 问题答案: 那是因为您需要使用双引号来代替。当用单引号引起来时,php不会将变量转换为它们的值

  • 问题内容: 显然,它不是根据长度来比较它们,而是通过编码来比较它们。但是,我不知道它是如何工作的。我需要一些解释:-) 问题答案: 字符串按字典顺序进行比较。即逐个字符,直到它们不相等或没有要比较的字符为止。“11”的首字符小于“ 3”的首字符。 如果我们使用字母,则因为不小于,不小于,但是由于小于,小于。 您可以将字符串显式转换为数字:

  • 问题内容: 我有一些奇怪的字符串池行为的问题。我正在使用比较相等的字符串来找出它们是否在池中。 输出为: 这对我来说是一个很大的惊喜。有人可以解释一下吗?我认为这是在编译时发生的。但是,为什么添加到String 根本没有任何区别呢? 问题答案: 是一个编译时常量,而 不是。因此,前者仅编译为字符串常量“ 555”,而后者则编译为实际的方法调用和串联,从而生成一个新的String实例。 另请参见JL

  • 问题内容: 他们为什么决定使用 Java和.NET(和其他一些语言)使其不可变?他们为什么不使它可变? 问题答案: 根据Effective Java第四章第73页第2版: “这样做有很多充分的理由:不可变的类比可变的类更易于设计,实现和使用。它们不易出错且更安全。 […] “ 不可变对象很简单。不可变对象可以恰好处于一种状态,即创建时的状态。如果确保所有构造函数都建立类不变式,则可以保证这些不变式