1. 程式人生 > >== 與 equals 的恩怨情仇

== 與 equals 的恩怨情仇

這篇講明 == 與 equals 的區別

Java中資料型別分為基本資料型別和引用資料型別

基本資料型別不用通過new關鍵字來建立變數,直接儲存“值”並置於堆疊中,更加高效。
如:boolean、char、byte、short、int、long、float、double、void。
引用資料型別通過new關鍵字來完成建立。
如:String,Integer

== 比較的是物件的引用。
equals 適用於引用型別的比較,不能用來比較基本資料型別,基本資料型別直接使用 == 和 != 來比較 。預設比較的是物件的引用,可以對預設實現進行自定義,進行其他的比較。

例項程式碼:

 public static void main(String[] args) {
        int int1 = 1;
        int int2 = 1;
        Integer integer1 = new Integer(1);
        Integer integer2 = new Integer(1);
        System.out.println("基本資料型別比較:"+ (int1 == int2));
        System.out.println("Integer的equals:"+integer1.equals(integer2));
        System.out
.println("Integer的=="+(integer1 == integer2)); }

執行結果:

基本資料型別比較:true
Integerequals:true
Integer的==false

上面的integer1和integer2是分別new出來的,會有自己各自的地址值,也就是自己的引用,所以 == 比較的時候結果是false,但是equals的結果是true.why?,隨我進入原始碼一探究竟:
Integer原始碼片段:

   public boolean equals(Object obj) {
        if (obj instanceof
Integer) { return value == ((Integer)obj).intValue(); } return false; }

原來如此,在Integer的原始碼中equals比較的不再是引用,而是值,所以結果是true.

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;
    }

Object原始碼中equals中的實現:

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