1. 程式人生 > >&和&&,==和equals的區別

&和&&,==和equals的區別

&和&&   

 相同點:都可以表示邏輯與(and),當運算子兩邊的結果都為true時,結果才為true,只要有一邊為false,結果就為false。

 不同點:&&還有短路的作用,即如果第一個表示式的結果為false,就不再計算第二個表示式。而&會把第二個表示式也計算了。 

                

                

==和equals   

(1)對於字串變數來說,使用“==”和“equals()”方法比較字串時,其比較方法不同。

     “==”比較兩個變數本身的值,即兩個物件在記憶體中的首地址。

     “equals()”比較字串中所包含的內容是否相同。

(2)對於非字串變數來說,"=="和"equals"方法的作用是相同的都是用來比較其物件在堆記憶體的首地址,即用來比較兩個引用變數是否指向同一個物件。

關於equals與==的區別從以下幾個方面來說:

    (1) 如果是基本型別比較,那麼只能用==來比較,不能用equals

                

    (2)對於基本型別的包裝型別,比如Boolean、Character、Byte、Shot、Integer、Long、Float、Double等的引用變數,==是比較地址的,而equals是比較內容的。

                

這是Integer的例項,如果是其他的比如Double、Character、Float等也一樣

    (3) 對於String(字串)作進一步的說明。

package com.learn;
/**
 * @ author:森林之下
 * @ Date: Created in 14:26 2018/11/19
 * @ Description: 測試==和equals
 */
public class Test1 {
    public static void main(String[] args) {
        String s1 = "123";
        String s2 = "123";
        String s3 = "abc";
        String s4 = new String("123");
        String s5 = new String("123");
        String s6 = new String("abc");

        System.out.println(s1 == s2);//true,s1與s2分別指向由字串常量”123” 建立的物件,在常量池中,只有一個物件,
                                    // 內容為123,有兩個引用s1和s2指向這個物件,故這兩個引用變數所指向的地址是相同的
        System.out.println(s1.equals(s2));//true,兩個物件的內容都是字串常量”123”
        System.out.println(s1 == s3);//false,s1和s3指向物件不同,地址當然不同
        System.out.println(s1.equals(s3));//false,內容當然不同

        System.out.println(s4 == s5);//false,s4和s5是用new操作符創建出來的,是在記憶體中分配兩塊空間給這兩個物件的,
                                    // 因而這兩個物件的記憶體地址不一樣
        System.out.println(s4.equals(s5));//true,內容相同
        System.out.println(s4 == s6);//false,是兩塊不同的空間,不同的物件,記憶體地址不同
        System.out.println(s4.equals(s6));//false,內容不同

        System.out.println(s1 == s4);//false,分別指向兩個不同的物件
        System.out.println(s1.equals(s4));//true,內容相同
    }
}

    (4)最後一種情況 

class Value { 
  int i; 
} 
public class EqualsMethod2 { 
  public static void main(String[] args) { 
    Value v1 = new Value(); 
    Value v2 = new Value(); 
    v1.i = v2.i = 100; 
    System.out.println(v1.equals(v2));//(1)flase 
    System.out.println(v1 == v2);//(2)false 
  } 
} 
/*如果在新類中被覆蓋了equals方法,就可以用來比較內容的。但是在上面的例子中類Value並沒有覆蓋Object中的equals方法,而是繼承了該方法,因此它就是被用來比較地址的,又v1和v2的所指向的物件不相同,故標記(1)處的v1.equals(v2)執行結果為false,標記為(2)處的v1 == v2執行結果也為false。 */

注:==和equals部分引用https://www.cnblogs.com/bluestorm/archive/2012/03/02/2377615.html