【问题标题】:Difference in the results of String comparison in Java? [duplicate]Java中String比较结果的差异? [复制]
【发布时间】:2019-02-15 21:14:31
【问题描述】:

Java如何实现下面的字符串比较

public class MyClass {
    public static void main(String args[]) {
        String a = "Chaipau";
        String b = "pau";

        System.out.println(a == "Chai"+"pau"); //true
        System.out.println(a == "Chai"+b); //false
    }
}

这与How do I compare strings in Java? 不同,因为答案不包含在第二种情况下创建新对象的原因,因为它本可以指向与第一种情况相同的对象引用。

【问题讨论】:

  • 不要这样比较字符串。 stackoverflow.com/questions/513832/…
  • 这是一个参考比较,不要指望它表现得像值比较
  • 是的,但想知道结果是如何获得的。
  • == 比较引用,因此标识对象占用的两个内存区域的“数字”。它是 32 位或 64 位值,具体取决于平台。总之,结果是不确定的,因为它取决于内存的实际状态;这就是原因,因为在比较非原始类型时不应使用 ==。
  • 第一个是常量,在字符串常量池中,因此两个引用指向常量池中的同一个东西。第二个不是常量,但您尝试从常量池中引用它,因此是错误的

标签: java string string-comparison


【解决方案1】:

"Chai"+"pau" 在语义上与"Chaipau" 相同,因此与a 所指的实例相同。

"Chai"+b 在运行时求值(因为b 不是编译时常量表达式),创建String 的新实例,因此与a 所指的实例不同。

【讨论】:

  • 具体来说,"Chai"+"pau" 是一个compile-time constant:“String 类型的常量表达式总是被“interned”以便共享唯一的实例”
  • 酷,声明 final String b = "pau";将变量 b 留给编译时表达式,第二种情况的结果为真。
猜你喜欢
  • 2012-12-22
  • 1970-01-01
  • 2015-06-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-09-04
相关资源
最近更新 更多