【问题标题】:string pool in java [duplicate]java中的字符串池[重复]
【发布时间】:2013-06-08 14:20:32
【问题描述】:

我正在字符串池中创建 2 个字符串,而不使用 new 关键字,如图所示 下面

String s="abc";
String s1="def";

我通过连接以上两个字符串再创建一个,如下所示

String s3=s+s1;
System.out.println(s3==s+s1);

结果为假。

我想知道结果背后的原因,是因为不可变性,即字符串的状态不能改变。

【问题讨论】:

  • 这个问题已经被问过很多次了。你真的搜索过吗?
  • stackoverflow.com/questions/15805578/… 是一个带有相关内容链接的答案。
  • @Vorsprung 如何麻醉你的代表!
  • 呵呵,如果你在那里读到我的回答,那就太差了。最好阅读整个线程和从那里链接的其他内容

标签: java string


【解决方案1】:

规则:用 .equals() 比较字符串

这可能太笼统了,但现在就遵守这个规则

【讨论】:

    【解决方案2】:

    “==”运算符比较对象在内存中的位置或比较引用

    Java String 类实际上覆盖了 Object 类中的默认 equals() 实现——它覆盖了该方法,因此它只检查字符串的值,而不是它们在内存中的位置。

    所以如果你比较 s3.equals(s+s1) 那么它将返回 true

    参考:http://www.programmerinterview.com/index.php/java-questions/java-whats-the-difference-between-equals-and/

    【讨论】:

    • 是的,我知道 == 查找内存位置,而 .equals 查找内容,因为对象是在池字符串中创建的,而不是使用 new 关键字,我有点困惑,但原因是连接后创建了具有相同内容的新对象,并且由于字符串的属性(即不变性)它不引用 s3
    【解决方案3】:

    是的,字符串是不可变的,但在运行时创建的字符串不是单例。因此可以存在两个包含相同字符序列的 String 实例。

    两个字符串相等,但不相同(这是您使用 == 运算符测试的内容)。

    【讨论】:

      【解决方案4】:

      == 供参考比较。如果你需要对象比较,你应该使用.equals

      关于字符串连接。

      来自http://docs.oracle.com/javase/specs/jls/se7/html/jls-3.html#jls-3.10.5

      在运行时通过连接计算的字符串是新创建的,并且 因此不同。

      【讨论】:

        【解决方案5】:

        我想你知道,== 运算符比较对象引用,而不是对象内容。仅当操作数是相同的物理对象时才返回true

        这里返回false 的原因仅仅是因为连接进行了两次,所以你最终得到了两个不同的计算String 对象。 Java 编译器不够积极,无法在编译时评估这两个表达式,并且在运行时,String 连接的结果不会添加到实习池中。

        【讨论】:

        • 这意味着连接导致具有相同内容的新字符串不引用相同的对象。这背后的原因是不变性,不是吗??
        • 好的..我明白了,我知道 == 查找内存位置,.equals 在这里查找内容,因为我创建了两个字符串而不使用 new 关键字我有点困惑。谢谢你答案,我只想知道这是因为不可变性,结果是错误的
        • 不,它确实与不变性无关。这两个计算每个都创建一个对象,因此,您有两个单独的对象。如果您两次调用返回可变对象的函数,那么您同样会得到两个不同的对象。
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2010-12-25
        • 1970-01-01
        • 1970-01-01
        • 2013-10-25
        • 1970-01-01
        相关资源
        最近更新 更多