字符串相加不一定相等

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("helloworld");
	    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
	helloworld
	false
	false

为什么结果会不同?![]

  1. 事实上并不是表面看起来这么简单,给字符串直接赋值的在java看来其实就是常量,他们会被放到常量池中,存储地址为常量池地址,另外,常量池中的常量是唯一的,这就很好解释s7是true
  2. 对于s8,s8是new出来的,new出来的一律在堆中,自然而然与s1不相等。
  3. 对于s4,s5,s6,这三个本质上其实是一样的,这三个赋值式中,都有变量,对于这种变量加常量,常量加变量,变量加变量这三种来说,对于String类型的变量java在执行的时候会给变量new出一个对象(StringBuilder)然后调用append方法,进行字符串的拼接。既然是new出来的那么地址自然就在堆内存中。
  4. 对于s8和s9,两个都是new出来的,地址根本不一样,自然不相等

总结:所以来说 字符串+字符串不一定等于字符串
字符串常量 + 字符串常量 = 字符串常量

猜你喜欢

转载自www.cnblogs.com/tyhA-nobody/p/12897729.html