1. 程式人生 > 其它 >Java中equals和==的區別

Java中equals和==的區別

一、java當中的資料型別和“==”的含義:

基本資料型別(也稱原始資料型別) :byte,short,char,int,long,float,double,boolean。他們之間的比較,應用雙等號(==),比較的是他們的值。

引用資料型別:當他們用(==)進行比較的時候,比較的是他們在記憶體中的存放地址(確切的說,是堆記憶體地址)。

注:對於第二種型別,除非是同一個new出來的物件,他們的比較後的結果為true,否則比較後結果為false。因為每new一次,都會重新開闢堆記憶體空間。

二、equals()方法介紹:

JAVA當中所有的類都是繼承於Object這個超類的,在Object類中定義了一個equals的方法,equals的原始碼是這樣寫的:
public boolean equals(Object obj) { //this - s1 //obj - s2 return (this == obj);}

可以看到,這個方法的初始預設行為是比較物件的記憶體地址值,一般來說,意義不大。所以,在一些類庫當中這個方法被重寫了,如String、Integer、Date。在這些類當中equals有其自身的實現(一般都是用來比較物件的成員變數值是否相同),而不再是比較類在堆記憶體中的存放地址了。

所以說,對於複合資料型別之間進行equals比較,在沒有覆寫equals方法的情況下,他們之間的比較還是記憶體中的存放位置的地址值,跟雙等號(==)的結果相同;
如果被複寫,按照複寫的要求來。

做個總結:

== 的作用:
基本型別:比較的就是值是否相同
引用型別:比較的就是地址值是否相同

equals 的作用:
引用型別:預設情況下,比較的是地址值。
但可以根據情況自己重寫該方法。一般重寫都是自動生成,比較物件的成員變數值是否相同。拿String類舉例:

1、舉例程式碼如下:

public class StringDemo {
public static void main(String[] args) {
String s1 = "Hello";
String s2 = "Hello";
System.out.println(s1 == s2); // true
}
}
上方程式碼中,用“==”比較s1和s2,返回的結果是true。

2、稍微改動一下程式:

public class StringDemo {
public static void main(String args[]) {
String str1 = "Hello";
String str2 = new String("Hello");
String str3 = str2; // 引用傳遞
System.out.println(str1 == str2); // false
System.out.println(str1 == str3); // false
System.out.println(str2 == str3); // true
System.out.println(str1.equals(str2)); // true
System.out.println(str1.equals(str3)); // true
System.out.println(str2.equals(str3)); // true
}
}
上方第4行程式碼中,我們new了一個物件,用“==”比較s1和s2,返回的結果卻是false;而用用“equals”比較s1和s2,返回的結果是true。

現在我們可以給自己出一道面試題:面試題:請解釋字串比較之中“==”和equals()的區別?
==:比較的是兩個字串記憶體地址(堆記憶體)的數值是否相等,屬於數值比較;
equals():比較的是兩個字串的內容,屬於內容比較。

以後進行字串相等判斷的時候都使用equals()。

3、再次更改程式:

public class ObjectDemo{
public static void main(String[] args) {
String s1 = "Hello";
String s2 = new String("Hello");
s2 = s2.intern();
System.out.println(s1 == s2); // true
System.out.println(s1.equals(s2)); // true
}
}
上述程式碼的第5行中,java.lang.String的intern()方法"abc".intern()方法的返回值還是字串"abc",表面上看起來好像這個方法沒什麼用處。但實際上,它做了個小動作:檢查字串池裡是否存在"abc"這麼一個字串,如果存在,就返回池裡的字串;如果不存在,該方法會 把"abc"新增到字串池中,然後再返回它的引用。