==號和equals()方法都是比較是否相等的方法,那它們有什麼區別和聯繫呢? java
首先,==號在比較基本數據類型(指的值類型)時比較的是值,而用==號比較兩個對象時比較的是兩個對象的地址值:ide
int x = 10; int y = 10; String str1 = new String("abc"); String str2 = new String("abc"); System.out.println(x == y); // 輸出true System.out.println(str1 == str2); // 輸出false
那equals()方法呢?咱們能夠經過查看源碼知道,equals()方法存在於Object類中,由於Object類是全部類的直接或間接父類,也就是說全部的類中的equals()方法都繼承自Object類,而經過源碼咱們發現,Object類中equals()方法底層依賴的是==號,那麼,在全部沒有重寫equals()方法的類中,調用equals()方法其實和使用==號的效果同樣,也是比較的地址值,然而,Java提供的全部類中,絕大多數類都重寫了equals()方法,重寫後的equals()方法通常都是比較兩個對象的值:this
public class Test { public static void main(String[] args) { Student s1 = new Student(23); Student s2 = new Student(23); System.out.println(s1.equals(s2)); } } class Student{ private int age; public Student(){} public Student(int age){ this.age = age; } }
這裏自定義了一個Student類,沒有重寫equals()方法,最後的輸出結果是:falsespa
class Student{ private int age; public Student(){} public Student(int age){ this.age = age; } @Override public boolean equals(Object obj){ if (obj instanceof Student) { Student stu = (Student) obj; return this.hashCode() == stu.hashCode(); } return false; } @Override public int hashCode(){ return this.age; } }
在重寫了equals()方法後,輸出結果變成了true。對象
如今一些基本的已經講的差很少了,接下來咱們回到第一個例子:blog
String str1 = new String("abc"); String str2 = new String("abc"); System.out.println(str1.equals(str2)); System.out.println(str1 == str2);
根據上面所講,第一個是true,第二個是false,確實如此,那繼續看下面的例子:繼承
String s1 = "abc"; String s2 = "abc"; System.out.println(s1.equals(s2)); System.out.println(s1 == s2);
此次的結果和上一個的是同樣的嗎?答案是:true true
爲何第二個會是true呢?
這就涉及到了內存中的常量池,常量池屬於方法區的一部分,當運行到s1建立對象時,若是常量池中沒有,就在常量池中建立一個對象」abc」,第二次建立的時候,就直接使用,因此兩次建立的對象實際上是同一個對象,它們的地址值相等。內存
那上一個例子中的源碼
String str1 = new String("abc");
是怎麼回事呢?
這裏其實建立了兩次對象,因此str1和str2的地址值不相等。hash