2013年12月1日 星期日

String equals( ) 與 compareTo( ) 方法的不同

     Java 中要比對字串是否相等,我們可以使用 equals 或者 compareTo 方法來實現,但是它們之間有甚麼不同呢 ? equals 與 compareTo 之間主要的不同有下面兩點:

  1. 如果傳入的參數是 null 時, equals  總是回傳 false,而 compareTo 則是丟出 java.lang.NullPointerException。
    範例如下:
     "foo".equals((String)null)  // 回傳 false
     "foo".compareTo((String)null) == 0 // 丟出 NullPointerException
    

  2. compareTo 除了可以比對字串是否相等外,還可以得知哪一個字串比較大或者小,equals 只能比對是否相等。
     另外好奇的是,為何將 null 傳入 equals 裡面會沒事,看了一下原始碼你會發現類似下面的程式碼:
   if (anObject instanceof String) {
      ...  
   }
    而 null 是物件的參考常數值,它可以被任何物件所參考,但它不屬於任何物件。也就是說 null instanceof object 總是回傳 false,故在將它傳入 equals method 並不會丟出任何例外。

    下面是從 Oracle 上查詢到的資料,解釋有關 null type。有興趣的人可以連結過去查看。
4.1. The Kinds of Types and Values
There is also a special null type, the type of the expression null (§3.10.7, §15.8.1), which has no name.
Because the null type has no name, it is impossible to declare a variable of the null type or to cast to the null type.
The null reference is the only possible value of an expression of null type.
The null reference can always undergo a widening reference conversion to any reference type.
In practice, the programmer can ignore the null type and just pretend that null is merely a special literal that can be of any reference type.   

沒有留言: