public class Main {
public static void main(String[] args) {
String a = "hello";
String b = "hello";
String c = new String("hello");
if (a == b) {
System.out.println("a==b");
} else {
System.out.println("a!=b");
}
if (a == c) {
System.out.println("a==c");
} else {
System.out.println("a!=c");
}
}
}
Java语言并不直接暴露对象的内存地址,我们并不能直接打印地址来对比,但是我们可以从侧面推理出来这个结果.这里有一个前提就是,==对于基本数据类型是判断值是否相等,而对于引用数据类型是判断的地址是否相等,Java里面比较字符串是否相等或者一些类是否相等,往往都是用的equals方法,因为equals方法只关注内容是否一样,而不是地址.在实际应用的时候,我们一般确实只需要比较内容是否相等就行了,
大家可以先运行一下这段代码,不难发现,a和b是相等的,但是a和c是不相等的.这是因为当直接创建一个没有用过的一段字符串,Java就会在字符串常量池里创建,如果后面还有变量使用的话,就会直接把字符串常量池里的这个字符串的地址赋给这个变量.
而new关键字我们都知道,它的数据会在堆里面开辟一个新的内存,所以不管你new多少个字符串"hello",他们的地址都是不同的.
评论区