https://blog.csdn.net/ZLK1142/article/details/86094325
-
为什么两个值相等的普通对象使用equals()比较,返回的是false,而两个String对象使用equals() 比较,返回的却是
true ?原因是两个普通对象所使用的equals()是超类(Object类)中的方法, 而String对象使用的是它自己的equals()方法,在String类的底层重写了超类(Object类)的equals() 和 hashCode()
方法。 -
从 String 类中的 equals() 方法可看出,String类的equals() 方法比 Object 类的equals()方法多了一个值判断;
-
在 String 类中,equals()方法只要两个String
引用指向同一个对象,或两个String对象的值是一样的,即返回true; -
在 Object 类中,equals()
方法只能是两个引用指向同一个对象,才返回true,没有对值进行比较;3.== (双等号)
-
对于基本数据类型,== 号比较的是值;
-
对于引用类型, == 号比较的是两个对象的地址值是否一样,即两个引用指向的是否是同一个对象
public void run1() { String str1 = "a" + "b" + "c" + 1 + 2 + 3; String str2 = "abc123"; String str3 = new String("abc123"); System.out.println(str1 == str2); // true System.out.println(str2 == str3); // false System.out.println(str2.equals(str3)); // true }
String str1 = “a” + “b” + “c” + 1 + 2 + 3; 由于"a" + “b” + “c” + 1 + 2 + 3 都 是常量值,所以在编译阶段会被编译成str2 = “abc123”; 如果在常量池中没有该字符串,JVM会将其字符串放入常量池;
再到 str2 = “abc123” 时,由于常量池中已有该字符串,所以不会再生成新的字符串,str2 指向的就是常量池中的那个 “abc123”, 所以 str1 == str2 返回 true;
str3 使用 new 来创建字符串对象,JVM 会在堆中开辟一块内存来存放该字符串对象,所以 str3 存放的是堆中的该对象地址,而不是常量池中的(abc123)字符串。str2 指向的是常量池中的字符串,str3 指向的是堆中的对象,所以str2 == str3 返回 false。
String 类重写了equals() 方法,只要两个String 引用指向同一个对象,或两个String对象的值是一样的,即返回true,str2 和 str3 中的值是一样的,所以str2.equals(str3) 返回 true;