//基本數據類型的比較 int num1 = 10; int num2 = 10; System.out.println(num1 == num2); //true //引用數據類型的比較 String s1 = "chance"; String s2 = "chance"; System.out.println(s1 == s2); //true System.out.println(s1.equals(s2)); //true //String類中==與equals的比較 String s3 = new String("chance"); String s4 = new String("chance"); System.out.println(s3 == s4); //false System.out.println(s3.equals(s4)); //true //非String類中==與equals類型的比較 Scanner scanner = new Scanner(System.in); Scanner scanner2 = new Scanner(System.in); System.out.println(scanner.equals(scanner2)); //false Scanner sc = scanner; System.out.println(scanner.equals(sc)); //true
輸出:數組
truethis
truespa
truecode
false對象
trueblog
false繼承
true內存
1.==在基本數據類型中的比較
「==」 屬於關係運算符,比較的是兩個基本數據類型的值是否相等.字符串
int num1 = 10; int num2 = 10; System.out.println(num1 == num2);
num1 和num2都是int型 它們的值都是10,所以使用」==」固然相等.遍歷
2.==在引用數據類型中的比較
2.1在String類中的比較
2.1.1不new String類對象時的比較
首先在引用數據類型中==比較的是引用的對象是否相等,便是否引用了同一個對象
String s1 = "chance";
String s2 = "chance";
System.out.println(s1 == s2); //true
System.out.println(s1.equals(s2)); //true
當執行String s1 = 「chance」;這條語句時,會在堆中的字符常量池裏找」chance」這個字符串,若沒有找到,則將」chance」這個字符串放入字符串常量池中.而在棧中開闢一塊名爲s1的空間存放」chance」,這塊空間的引用.
當執行String s2 = 「chance」;這條語句時,會在堆中的字符串常量池裏找」chance」這個字符串,很顯然,能夠找到,因而便把字符常量池裏」chance」這個字符串的引用地址賦給s2,所以s1與s2存放的都是堆中字符常量池中的同一個」chance」的引用
具體圖以下:
接着System.out.println(s1.equals(s2));這裏的equals在String類中被重寫過,用來比較兩個字符串的實際內容是否相等,即每個字符是否相等,重寫方法末尾會另作說明!!!由於比較的是字符串內容,s1,s2內容都是chance固然是相等的。
String s3 = new String("chance"); String s4 = new String("chance"); System.out.println(s3 == s4); //false System.out.println(s3.equals(s4)); //true
當程序執行String s3 = new String(「chance」); 這一句時,會在堆內存中開闢一塊空間用於存放」chance」這一字符串.並在棧中開闢一塊名爲s3的內存空間存放堆中剛剛建立的」chance」對象的引用.
程序執行String s4 = new String(「chance」); 這句時,會在堆內存中開闢另外一塊空間用於存放」chance」這一字符串,並在棧中開闢一塊名爲s4的內存空間存放堆中剛剛建立的」chance」對象的引用.
由於s3和s4中存放的是兩個不一樣對象的引用,天然System.out.println(s3 == s4); 返回的是false;
由於仍是String類 所以equals方法比較的仍是字符串中內容是否相等,即每一個字符是否相等。可見s3和s4這兩個對象中中存放都是」chance」,天然每一個字符都相等.
圖示以下:
以前有說過String類中重寫了equals,出於好奇,我找到了String類中的equals方法,其方法體以下:
public boolean equals(Object anObject) { if (this == anObject) { return true; } if (anObject instanceof String) { String anotherString = (String) anObject; int n = value.length; if (n == anotherString.value.length) { char v1[] = value; char v2[] = anotherString.value; int i = 0; while (n-- != 0) { if (v1[i] != v2[i]) return false; i++; } return true; } } return false; }
可見String類中的equals方法被重寫成,比較兩個對象中對象的內容是否相等,該方法將兩個String對象拆分紅字符數組,而後經過遍歷字符數組中的每個字符是否都相等,若相等,則返回true 不然返回false;
而咱們查看通常對象的equals方法,其方法體以下:
public boolean equals(Object obj) { return (this == obj); }
三行代碼,判斷的就是兩個對象是否屬於一個對象
以下:
Scanner scanner = new Scanner(System.in); Scanner scanner2 = new Scanner(System.in); System.out.println(scanner.equals(scanner2)); //false Scanner sc = scanner; System.out.println(scanner.equals(sc)); //true
執行第一條語句Scanner scanner = new Scanner(System.in); 時在堆中開闢了一塊內存存放Scanner對象,在棧內存中開闢一塊名爲scanenr的內存存放Scanner對象的引用.
執行第二條語句Scanner scanner2 = new Scanner(System.in); 時時在堆中另外開闢了一塊內存存放Scanner對象,在棧內存中開闢一塊名爲scanenr2的內存存放Scanner對象的引用.
由於這裏調用的是通常對象的equals方法,所以比較的是兩個對象是否屬於同一個對象,顯然不是同一個對象.
圖以下:
至於最後一個Scanner sc = scanner;則將scanner對象的引用複製給sc所以,sc和scanner指向都是堆中同一個Scanner對象,天然比較的都是相等的.
示例圖以下:
總結:
==是一個比較運算符號,既能夠比較基本數據類型,也能夠比較引用數據類型,基本數據類型比較的是值,引用數據類型比較的是地址值。 * equals方法是一個方法,只能比較引用數據類型,全部的對象都會繼承Object類中的方法,若是沒有重寫Object類中的equals方法,equals方法和==號比較引用數據類型無區別,重寫後的equals方法比較的是對象中的屬性。==和equals的做用都是同樣的,只不過在String類中重寫了equals方法,纔會變得這麼複雜!!!!