1. 程式人生 > 實用技巧 >Java中的 "==" 和 "equals" 區別

Java中的 "==" 和 "equals" 區別

分析 "==" 和 "equals" 區別的時候先了解一下Java的記憶體。

Java記憶體

“==” 和 “equals” 區別”

“==”:

“==”比較的是棧記憶體中物件的變數的物件存放在堆裡面的具體地址,用來判斷兩個物件的地址是否相等。即是否指向同一個物件。是真正意義上的指標操作。
  
1、比較的是操作符兩端的運算元是否是同一個物件
  2、兩邊的運算元必須是同一型別的(可以是父子類之間)才能編譯通過。
  3、比較的是地址,如果是具體的阿拉伯數字的比較,值相等則為true,如:int a=10 與 long b=10L 與 double c=10.0都是相同的(為true),因為他們都指向地址為10的堆。

“equals”:

“equals”是用來比較兩個物件的內容是否相等。由於所有類都繼承java.lang.Object類,因此所有的物件都可以呼叫“equals”方法。如果該類沒有對“equals”方法進行重寫, 呼叫的仍然是“java.lang.Object.equals”方法。

>“java.lang.Object.equals”方法:

1 public boolean equals(Object obj) {
2     return (this
== obj); 3 }

從上邊可以看出來,“java.lang.Object.equals”方法依舊是比較的兩個物件的地址是否相等。

>在java.lang.String方法中,重寫了“equals”方法:

 1 public boolean equals(Object anObject) {
 2         if (this == anObject) {
 3             return true;
 4         }
 5         if (anObject instanceof String) {
6 String anotherString = (String)anObject; 7 int n = value.length; 8 if (n == anotherString.value.length) { 9 char v1[] = value; 10 char v2[] = anotherString.value; 11 int i = 0; 12 while (n-- != 0) { 13 if (v1[i] != v2[i]) 14 return false; 15 i++; 16 } 17 return true; 18 } 19 } 20 return false; 21 }

 Tip:對equals重新需要注意五點:

  1 自反性:對任意引用值X,x.equals(x)的返回值一定為true;
  2對稱性:對於任何引用值x,y,當且僅當y.equals(x)返回值為true時,x.equals(y)的返回值一定為true;
  3傳遞性:如果x.equals(y)=true, y.equals(z)=true,則x.equals(z)=true ;
  4 一致性:如果參與比較的物件沒任何改變,則物件比較的結果也不應該有任何改變;
  5 非空性:任何非空的引用值X,x.equals(null)的返回值一定為false 。

詳解String型別中 “==” 和 “equals” 區別

詳解String型別直接賦值和new的區別:

1.String s="abce"是一種非常特殊的形式,和new 有本質的區別。它是java中唯一不需要new 就可以產生物件的途徑。以String s="abce";形式賦值在java中叫直接量,它是在常量池中而不是像new一樣放在記憶體的堆中。

這種形式的字串,在JVM內部發生字串拘留,即當宣告這樣的一個字串後,JVM會在常量池中先查詢有有沒有一個值為"abcd"的物件,如果有,就會把它賦給當前引用.即原來那個引用和現在這個引用指點向了同一物件,如果沒有,則在常量池中新建立一個"abcd",下一次如果有String s1 = "abcd";又會將s1指向"abcd"這個物件,即以這形式宣告的字串,只要值相等,任何多個引用都指向同一物件.
2.String s = new String("abcd");和其它任何物件一樣.每呼叫一次就產生一個物件,只要它們呼叫。

兩者可以簡單的理解為:String str = "hello"; 先在記憶體中找是不是有"hello"這個物件,如果有,就讓str指向那個"hello".如果記憶體裡沒有"hello",就建立一個新的物件儲存"hello". String str=new String ("hello") 就是不管記憶體裡是不是已經有"hello"這個物件,都新建一個物件儲存"hello"。

 1 public class test1 {
 2     public static void main(String[] args) {
 3         String a = new String("ab"); // a 為一個引用
 4         String b = new String("ab"); // b為另一個引用,物件的內容一樣
 5         String aa = "ab"; // 放在常量池中
 6         String bb = "ab"; // 從常量池中查詢
 7         if (aa == bb) // true
 8             System.out.println("aa==bb");
 9         if (a == b) // false,非同一物件
10             System.out.println("a==b");
11         if (a.equals(b)) // true
12             System.out.println("aEQb");
13         if (42 == 42.0) { // true
14             System.out.println("true");
15         }
16     }
17 }