【问题标题】:Comparing static final String using ==使用 == 比较静态最终字符串
【发布时间】:2023-02-11 02:35:28
【问题描述】:
public static final String FOO = "foo";

public String func1() {
  return FOO;
}

if(func1() == FOO) ....

Java 保证总是返回 true 吗?或者编译器可以内联字符串,而不是实习/记忆字符串,然后它可能会返回 false,因为编译器创建了两个不同的对象?

还是 static final 保证它使用定义的字符串对象,并且不会内联文本?

【问题讨论】:

    标签: java string object static final


    【解决方案1】:

    通常不建议在 Java 中使用 == 运算符比较两个静态最终 String 对象。 == 运算符比较两个对象的内存地址,看它们是否引用同一个对象,但 static final String 对象不是这样。

    当您在 Java 中声明一个 static final String 变量时,JVM 将池化字符串文字的所有实例,因此对同一个字符串文字的多个引用将引用内存中的同一个对象。但是,当你使用 new 操作符创建一个 String 对象时,它会在内存中创建一个新对象,即使字符串值相同。

    因此,在比较static final String对象时,推荐使用.equals()方法,比较的是两个对象的内容,而不是内存地址。这将确保比较正确完成并提供预期的结果。

    【讨论】:

      【解决方案2】:

      据我所知,这将返回 true。当使用文字 " 制作字符串时,字符串池将返回具有指定内容的现有字符串的实例(如果存在)。

      在这种情况下,代码也可以是

      public String func1() {
          return "foo";
      }
      
      if (func1() == "foo") ...
      

      , 文字是相同的,这意味着由文字产生的字符串实例也将是相同的

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2017-02-23
        • 2016-08-24
        • 2017-04-29
        • 1970-01-01
        相关资源
        最近更新 更多