字符串相加不一定相等
public class demo01 {
public static void main(String[] args) {
String s1 = "hellojava";
String s2 = "hello";
String s3 = "java";
String s4 = "hello" + s3;
String s5 = s2 + "java";
String s6 = s2 + s3;
String s7 = "hello" + "java";
String s8 = new String("hellojava");
System.out.println(s4);
System.out.println(s1 == s4);
System.out.println(s5);
System.out.println(s1 == s5);
System.out.println(s6);
System.out.println(s1 == s6);
System.out.println(s7);
System.out.println(s1 == s7);
System.out.println(s8);
System.out.println(s1 == s8);
}
}
输出结果:
hellojava
false
hellojava
false
hellojava
false
hellojava
true
hellojava
false
false
为什么结果会不同?![]
- 事实上并不是表面看起来这么简单,给字符串直接赋值的在java看来其实就是常量,他们会被放到常量池中,存储地址为常量池地址,另外,常量池中的常量是唯一的,这就很好解释s7是true
- 对于s8,s8是new出来的,new出来的一律在堆中,自然而然与s1不相等。
- 对于s4,s5,s6,这三个本质上其实是一样的,这三个赋值式中,都有变量,对于这种变量加常量,常量加变量,变量加变量这三种来说,对于String类型的变量java在执行的时候会给变量new出一个对象(StringBuilder)然后调用append方法,进行字符串的拼接。既然是new出来的那么地址自然就在堆内存中。
- 对于s8和s9,两个都是new出来的,地址根本不一样,自然不相等
总结:所以来说 字符串+字符串不一定等于字符串
字符串常量 + 字符串常量 = 字符串常量