如果我们通过字符串字面量在java中创建三个字符串string = "hel"+"lo";字符串B = "lo";字符串C = "hel"+B;. A == C为真,但输出为假。因为两者将在stringpool中共享相同的内存。我有点不明白为什么会发生这种事。
输出false的代码:
public class Main {
public static void main(String[] args) {
String A = "hel" + "lo";
String B = "lo";
String C = "hel" + B;
System.out.println(A == C);
}
}
打印true的代码:
public class Main {
public static void main(String[] args) {
String A = "hel" + "lo";
String B = "lo";
String C = "hel" + "lo";
System.out.println(A == C);
}
}
为什么我得到不同的结果,因为两者是相同的?
本例中的问题
public class Main {
public static void main(String[] args) {
String A = "hel" + "lo";
String B = "lo";
String C = "hel" + B;
System.out.println(A == C);
}
}
表示变量B
是可变的,因此表达式"hel" + B
不是常量表达式。
编译器将String C = "hel" + B;
行翻译成类似于
String C = "hel".concat(B);
生成一个新的字符串对象,该对象与字符串字面值"hello"
不同。
如果将B
变为常量变量并写入
public class Main {
public static void main(String[] args) {
String A = "hel" + "lo";
final String B = "lo";
String C = "hel" + B;
System.out.println(A == C);
}
}
则表达式"hel" + B
是常量表达式,编译器可以计算该表达式的值。
Java String类equals()方法根据字符串的内容比较两个给定的字符串。==操作符比较的是引用而不是值。试着理解下面的程序,你就会知道其中的区别了。
String A = "hel" + "lo";
String B = "lo";
String C = "hel" + B;
System.out.println(A.equals(C)); //true
class Teststringcomparison{
public static void main(String args[]){
String s1="Sachin";
String s2="Sachin";
String s3=new String("Sachin");
System.out.println(s1==s2);//true (because both refer to same instance)
System.out.println(s1==s3);//false(because s3 refers to instance created in nonpool)
}
}