【问题标题】:string and integer concatenation in java [duplicate]java中的字符串和整数连接[重复]
【发布时间】:2017-06-21 08:41:38
【问题描述】:
String s1 = "abcd5";

String s2 = "abcd"+"5";
String s3 = "adcd"+s1.length();
System.out.println("s1 == s2 : "+(s1 == s2));
System.out.println("s2 == s3 : "+(s2 == s3));
System.out.println("s1 == s3 : "+(s1 == s3));

为什么第一个陈述是正确的而其余陈述是错误的。 String 与 int 的连接行为是否不同?

【问题讨论】:

  • 不是那个问题的重复。这个问题完全不同。
  • @Pshemo 至少你链接的那个的上下文是相似的,当前重复的那个真的和这个问题无关。
  • 问题是你分配给“s3”的字符串在第二个位置有“d”。不幸的是,这已被标记为重复。所以比较是用“ab...”和“ad...”进行的,所以任何时候混合 s3 都是正确的行为

标签: java string


【解决方案1】:

编辑:

我虽然看过这段代码:

String s1 = "abcd5";    
String s2 = "abcd"+"5";
String s3 = "abcd"+s1.length();

而我的第一个解释:

因为s1s2 是字面字符串,所以在编译时它们具有相同的字符串值并且是实习的,因此引用相同的对象。
s3 是在运行时计算的字符串,因此它不会引用相同的字符串实例。


但其实代码是:

String s1 = "abcd5";

String s2 = "abcd"+"5";
String s3 = "adcd"+s1.length(); // a - d - c - d and not  a - b - c - d

正如@Aniruddh Dikhit 所注意到的(非常好的眼睛):在您分配给"s3" 时,字符串的"d" 在第二位,而不仅仅是在第四位。
因此,无论您以何种方式声明 s3(是否使用文字),s3 值与 s1s2 引用的字符串的值不同,因此它永远不会具有相同的对象引用。

【讨论】:

  • 知道了,在 s3 的情况下,编译器无法确定值,因此在运行时 s3 引用指向创建“abcd5”对象的堆。
  • s3="adcd" 是一个拼写错误,我们都知道这里讨论的真正概念是什么。
  • Ah Okaaay.... 确实,这个小字符串值差异对于陷阱问题来说似乎很奇怪。
最近更新 更多