1. 程式人生 > >淺談java中的比較機制

淺談java中的比較機制

對於程式語言來說,比較機制是核心機制之一,因為平時內建的比較機制,導致我對這個知識點沒有啥概念,總覺得他們本來就可以比較,最近在看Java容器的時候,發現原來Java做的封裝太好了,導致我們平時一般是不會接觸到這點。廢話不多說,來看下Java中的比較機制。
1:comparable介面
對於常見的類,大多數已經預設實現了該介面,而且這個介面就是Java比較機制的核心。來看下官方文件的說明:
This interface imposes a total ordering on the objects of each class that implements it. This ordering is referred to as the class’s natural ordering, and the class’s compareTo method is referred to as its natural comparison method.

Lists (and arrays) of objects that implement this interface can be sorted automatically by Collections.sort (and Arrays.sort). Objects that implement this interface can be used as keys in a sorted map or as elements in a sorted set, without the need to specify a comparator.

The natural ordering for a class C is said to be consistent with equals if and only if e1.compareTo(e2) == 0 has the same boolean value as e1.equals(e2) for every e1 and e2 of class C. Note that null is not an instance of any class, and e.compareTo(null) should throw a NullPointerException even though e.equals(null) returns false.
因為有點長,我就總結下,就是隻要類實現了comparable

介面,那個這個類就可以被Collections和Arrays這樣的工具類自動排序,它的比較的原理是呼叫該介面中的compareTo()方法,該方法會根據比較的結果返回一個正整數,0,或者是一個負數,分別表示大於,等於和小於三種結果。當我們實現comparable介面的時候,需要重寫compareTo()方法。
java中的自然排序就是指按照comparable中的方法進行的排序。
2:comparator介面:
comparator介面是java外接的一個比較器,它用於那些無法進行自我比較的物件或者是本身的比較方式無法完全滿足比較要求的物件。

int 	compare(T o1, T o2)  
boolean equals(Object obj)  

這是該介面中的兩個方法,comparator比較器呼叫compare()來進行比較,呼叫equals)()方法來判斷相等。對於comparator比較器而言,它體現了java在不改變原來物件的情況下,通過策略模式的手段,改變了相應物件行為的一種方式。因此,實現comparator介面的時候,需要實現compare()方法。
說到了比較的問題,那就必須要說說java中經常會問道的一個老問題,equals()方法和==的區別。equals()是在Object類中定義的一個方法,也就是說,即使我們的類中沒有顯式的定義該方法,但是我們的類已經從Object類中繼承了該方法。我們來看看該方法的原始碼:

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

我們可以看到,在equals()方法的底層,直接返回了this == obj的結果。我們知道,java中 = =的比較方式是比較兩個物件的地址,如果兩個地址是同一個地址,那麼返回的結果為true,否則就是為false,這也是我們經常面試筆試會問到的一個問題。但是,我們仍然是可以自定義equals()方法,使得按照我們的需求來判斷兩個物件是否是相等。就比如說,有兩個人,他們的名字和家庭地址都是一樣的,那麼我們就認為這兩個人是同一個人(這個例子有點傻逼,但是道理有了就可以)。很多方法都會重寫equals()方法,具體的類要具體分析。不過只要知道了這個知識點,理解起來就沒有那麼難了。
若有錯誤,請多擔待,後面還會持續的修改和補充。