1. 问题引入
案例1:
public class test01 {
public static void main(String[] args) {
String str1 = "hello";
String str2 = "hello";
System.out.println(str1==str2);
}
}
输出结果为:
true
案例2:
public class test02 {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
String str[] = new String[2];
for (int i = 0; i < 2; i++) {
str[i] = scanner.next();
}
//上面String数组的创建相当于创建了两个String对象
System.out.println(str[0]==str[1]);
}
}
输入:
hello hello
输出结果:
false
为什么两处的比较结果不相同呢?
2. 问题分析
java中的双等于(==)在进行简单数据类型(int、float)的比较时比较的是他们的值,而在进行复杂数据类型(对象)时比较的是它们在内存中的存放地址,案例1中数据的简单模型如下:
即栈中的地址直接指向"hello"字符串对象,因此str1和str2的地址相同即比较的结果为true
案例2中数据的简单模型如下:
调试结果:
可知str[0]==str[1]比较的是内存地址(堆中地址的内存地址(存放在栈中)),而不是去比较对象的值(“hello”),所以比较结果为false。
注:双引号括起来的都会在字符串常量池中占用内存且不会被垃圾回收器释放,创建一个对象(new)时会在堆内存中开辟一个空间(内存)
3. 总结
在进行字符串的比较时为避免出错最好使用字符串的equals()方法,equals()方法比较的是对象的值。