关于String类型的比较问题
这里对于我这个java新手,当遇到下面的问题,我当时产生了疑惑:
// java code
String s1 = "hello";
String s2 = "hello";
String s3 = "he";
String s4 = s3 + "llo";
System.out.println(s1==s2);
System.out.println(s1==s3);
System.out.println(s1==s4);
输出结果:
true
false
false
当时的疑惑是为什么 System.out.println(s1==s4); 输处的结果是false, 明明两个字符串的内容是一样的。经过查阅学习终于明白了原因,因为对于字符串而言,这里比较是比较的是内存地址。
下面我把上面的流程具体的说明一下:
String s1 在栈内存中声明一个s1, 然后在堆内存的字符串常量池中存贮一个"hello"的变量,这里我们假设地址为x001; 然后s1指向x001这个地址。
String s2 在栈内存中声明一个s2, 然后发现在堆内存的字符串常量池中发现一个"hello"的变量,然后s2便可以指向x001这个地址。
String s3 在栈内存中声明一个s3, 然后在堆内存的字符串常量池中存贮一个"he"的变量,这里我们假设地址为x002; 然后s3指向x001这个地址。
String s4 在栈内存中声明一个s4, 然后在堆内存的字符串常量池中存贮一个"llo"的变量,这里我们假设地址为x003; 但是要注意这里的s3+“llo”,这里实际上是完成了一个new 的动作,相当于在堆内存中重新声明并开辟了空间存储"hello",假设这里的地址为x004,和字符串常量池的"hello"的地址不一致,且s4指向的是x004这个地址,所以在上面的判断中显示结果是false.