题目代码化:
package StringTest;
public class Test {
public static void main(String[] args) {
System.out.println("test"=="test");//A
System.out.println("test"="test");//B
System.out.println("test".equals(new String("test")));//C
System.out.println("test"==(new String("test")));//D
}
}
答案:AC
分析:
- A: ==比较的两边的地址值,“test”在字符串常量池中时同一个对象,所以true
- B:乍一看是一个恒等式,返回true也没错,但是要注意一点的是,赋值语句=左边必须是变量,如果是常量编译器会报错,如图:,但如果左边是变量之后就只是一个字符串表达式了,而不是boolean类型,所以也不存在返回true和false的问题了。
- C:equals方法比较的是两个字符串的内容,所以true。
- D: ==右边在堆中new出来了一个新的对象,对象保存的是字符串常量池中test的地址,而此表达式本质是 字符串常量池中test的地址 == 堆中字符串对象的地址,所以false。