equals()是Object类中的方法,比较的是地址值,和“==”一样
查看Object源码可知,默认的equals()方法和“==”一样,比较的都是对象的地址值
String类重写了equals()方法
String类重写了equals()方法,故字符串的equals()方法比较的是俩字符串的内容
字符串常量池
【注意点1】因为存在字符串常量池,使用直接赋值的方式创建相同内容的字符串,指向的地址也是相同
String str1 = "abc";
String str2 = "abc";
// 因为存在字符串常量池,使用直接赋值的方式创建相同内容的字符串,指向的地址也是相同
System.out.println(str1 == str2);
System.out.println(str1.equals(str2));
【注意点2】但如果使用new String()的方式创建,即便内容相同,地址值也不相同
String str1 = new String("abc");
String str2 = new String("abc");
// 使用new的方式创建的字符串,即便内容相同,地址值也不是相同的
System.out.println(str1 == str2);
System.out.println(str1.equals(str2));
【注意点3】 因为JVM在编译时会优化,所以 String str1 = "a" + "b" + "c"和String str1 = "abc"是相同的
// JVM编译时会优化,等同于 String str1 = "abc";
String str1 = "a" + "b" + "c";
String str2 = "abc";
System.out.println(str1 == str2);
System.out.println(str1.equals(str2));
可以查看编译后的class文件验证