【问题标题】:String equals Evaluate [duplicate]字符串等于评估 [重复]
【发布时间】:2017-01-07 07:56:25
【问题描述】:

我在面试中遇到了如下问题:

String s = "abcde5";
String s1 ="abcde"+"5";
System.out.println(s==s1);
System.out.println(s.equals(s1));
String s4 = "abcd5";
String s3 = "abcd"+s4.length();
System.out.println(s3);
System.out.println(s3.equals(s4));
System.out.println(s3==s4);

我认为“==”的输出将始终为 false,因为使用 + 运算符将创建一个与执行 s4.length 相同的新字符串。但预期的答案是不同的。谁能告诉我为什么 s==s1 给出 true,而 s3==s4 给出 false。

预期的答案是: 真的 真的 abcd5 真的 假的

【问题讨论】:

  • 这与字符串实习无关。投票重新开放。

标签: java string equals


【解决方案1】:

s==s1 产生true 因为"abcde"+"5" 是一个常量表达式,即由字符串文字和连接组成的表达式。所有 Java 编译器必须将它们视为单个文字,即好像 + 不存在一样。

Java 语言标准在解释在字符串连接上创建新对象时,小心地对编译时常量字符串表达式做了一个例外:

当字符串连接运算符+(第 15.18.1 节)用于非常量(第 15.28 节)表达式时,会隐式创建一个新的类实例,从而生成 String 类型的新对象(第 4.3 节) .3)。

另一方面,表达式"abcd"+s4.length() 不是常量表达式。这就是为它创建一个新对象的原因,导致s3==s4 产生false

【讨论】:

  • 我在这里读到这个:stackoverflow.com/questions/10578984/… System.out.print((hello == ("Hel"+lo)) + " "); 其中static String hello = "Hello";String lo = "lo"; 这将返回false,因为连接“lo”不是一个常量表达式?
  • @Sumitsagar 是的,lo 不是字符串文字。上面的例子,即hello == ("Hel"+"lo")产生true
  • 所以除了连接字符串文字“==”之外的任何东西都会产生错误?你能告诉什么是(§4.3.3)符号吗?谢谢。
  • @Sumitsagar 不,其他常量表达式都可以(例如"23"=="2"+3demo)。 § 是对Java Language Specification 的引用。
  • 我尝试了更多.. 像s==s1+5 会产生错误。或s==s1+a //其中int a=5。并且s==(sn+"5") 也会给出错误,因为编译器必须在编译时解析它们的值?但是s=="abcde" +5 会给出正确的结果,因为简单来说,编译器不必评估变量。
猜你喜欢
  • 2020-04-20
  • 1970-01-01
  • 2020-02-29
  • 1970-01-01
  • 1970-01-01
  • 2012-01-04
  • 2012-07-25
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多