【问题标题】:String '==' and String pool behaviour [duplicate]字符串'=='和字符串池行为[重复]
【发布时间】:2013-10-25 12:06:22
【问题描述】:

我的问题很简单。有什么区别 -

s3=s1+s2s3="string" ?

我觉得我解释得太差了。

我明白==.equals() 之间的区别。

【问题讨论】:

  • 字符串对象与字符串文字不同。文字是直接出现在程序中的东西; s3 不存储文字,而是操作的结果。

标签: java string


【解决方案1】:

当 2 个对象串联时,将创建一个新的 String 对象。但如果你 concat 2 个字符串文字,则不会创建一个新对象。

String s3=s1+s2; // new object created
System.out.println(s3=="string"); // false

String s4="str"+"ing"; // this will not create a new string object
System.out.println(s4=="string"); // true

当编译器遇到String s4="str"+"ing";时,编译器会对编译时常量进行常量折叠并将其放入一个字符串中,因为连接发生在编译时本身,因此完成的字符串进入常量池.

【讨论】:

  • @Jayamohan - 感谢您的编辑!:)
  • +1。您可能想解释为什么它不会在后一个 String 中创建新对象。
  • 字符串 s3=s1+s2; // 创建了新对象,s3 引用了字符串池中的新对象,对吧?也就是说,说 s3 指向 s1+s2.. 的结果,对吗?
  • @R.J 太糟糕了,我不能投票.. :)
  • 不。它进入堆。但是,如果您手动调用s3 = s3.intern(),它会在常量池中查找您的字符串文字,如果找到,将返回对它的引用。这样您就可以使 s3 引用池中存在的文字。
【解决方案2】:

== 运算符检查对对象的引用是否相等。

equals() 方法检查对象的值是否相等。

比较字符串使用equals

System.out.println(s3.equals("string"));

【讨论】:

  • 我的问题很简单... - s3=s1+s2 和 s3="string" 有什么区别?
  • @X86 查看更新后的答案
  • 我很抱歉..但这不是我的问题..我的问题是这两个陈述之间有什么区别..顺便说一句,我理解 == 和 .equals() 之间的区别。
【解决方案3】:

函数==检查to的对象是否相同。

这里内容相同,但对象不同。

查看 Here 以了解 == 和 .equals 之间的区别

【讨论】:

    【解决方案4】:

    == 用于原始类型。在对象上,您应该使用比较或等于。字符串以特定方式处理。因为字符串上的 == 并不总是正常工作,这是由于 jvm 将它们连接起来所致。它只需要对字符串的引用,== 检查内存位置。

    【讨论】:

    • == 用于对象,以检查它们是否是同一个实例。在对象上应该使用equals 当一个人想要检查两个对象是否具有由这些对象上的equals 的特定实现所定义的“相同内容”(并且如果对象不覆盖equals,@987654325使用@,它只是比较使用==)。
    【解决方案5】:

    s3 是一个新的String 对象,它是s1s2 的串联

    == 将比较它们的内存地址。不是它们的字面值。使用.equals()

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-01-07
      • 2010-12-26
      • 2019-01-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-06-08
      • 1970-01-01
      相关资源
      最近更新 更多