java中的comparable與Comparator有區別嗎?針對這個問題,這篇文章給出了相對應的分析和解答,希望能幫助更多想解決這個問題的朋友找到更加簡單易行的辦法。
在Java代碼中,我們常常會面臨需要對集合進行排序的情況,這種情況下我們需要手動的定義Java比較器,告訴程序兩個對象如何比較大小。Comparable和Comparator接口都是為了對類進行比較,眾所周知,諸如Integer,double等基本數據類型,java可以對他們進行比較,而對于類的比較,需要人工定義比較用到的字段比較邏輯??梢园袰omparable理解為內部比較器,而Comparator是外部比較器。
Comparator比較器
Comparator 位于 java.util 包下,本質上是一個外比較器。若一個類內部未實現 Comparable 又或者實現了 Comparable 但該比較方式不是自己想要的,我們可以考慮實現 Comparator。Comparator 接口里有一個 compare 方法,使用方法與 Comparable 中的 compareTo 相同。
我們需要將 Comparator 傳遞給排序方法,以便對排序順序進行控制。我們可以查看幾個排序方法的使用方法,發現其可以傳入一個 Comparator 參數。
Collections.sort(List<T> list, Comparator<? super T> c); Arrays.sort(T[] a, Comparator<? super T> c);
修改我們之前的 Node 對象,不再實現 Comparable 。
public class Node{
private int num;
private String name;
@Override
public String toString() {
return "num=" + num + " name=" + name;
}
public Node(int num, String name) {
super();
this.num = num;
this.name = name;
}
public Node() {
super();
}
public int getNum() {
return num;
}
public void setNum(int num) {
this.num = num;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}我們嘗試通過傳入一個 Comparator 來實現降序排序。
public class MyTest {
public static void main(String[] args) {
List<Node> list = new ArrayList<Node>();
for(int i = 0;i < 10;i++) {
list.add(new Node(i,"node"));
}
//打亂順序
Collections.shuffle(list);
Collections.sort(list, new Comparator<Node>() {
@Override
public int compare(Node o1, Node o2) {
return o2.getNum()-o1.getNum();
}
});
for (Node node : list) {
System.out.println(node);
}
}
}結果如下:
num=9 name=node num=8 name=node num=7 name=node num=6 name=node num=5 name=node num=4 name=node num=3 name=node num=2 name=node num=1 name=node num=0 name=node
Comparator 實現了逆序比較。
Comparable比較器
Comparable 位于 java.lang 包下,本質上是一個內比較器,實現了 Comparable 的類可以自己比較,至于比較的結果如何則需要依賴于自然比較方法 compareTo 的實現。
compareTo 的返回值有 -1、0、1。若比較者大于被比較者,那么返回1,等于則返回0,小于返回-1。
Collections.sort 和 Arrays.sort 可以自動對實現 Comparable 的對象進行排序。
示例如下,我們構建一個 node 對象,并通過 node 對象之間的比較驗證 Comparable 的用法。
node 對象的實現如下:
public class Node implements Comparable<Object>{
private int num;
private String name;
@Override
public String toString() {
return "num=" + num + " name=" + name;
}
public Node(int num, String name) {
super();
this.num = num;
this.name = name;
}
public Node() {
super();
}
public int getNum() {
return num;
}
public void setNum(int num) {
this.num = num;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
@Override
public int compareTo(Object o) {
Node node = (Node)o;
return this.num - node.getNum();
}
}可以看到,我們為 Node 實現了 Comparable 接口,并且重寫了 compareTo 方法。
先測試一下,我們創建10個 Node 對象并添加進 List 中,然后把順序打亂。
public class MyTest {
public static void main(String[] args) {
List<Node> list = new ArrayList<Node>();
for(int i = 0;i < 10;i++) {
list.add(new Node(i,"node"));
}
//打亂順序
Collections.shuffle(list);
for (Node node : list) {
System.out.println(node);
}
}
}顯示結果如下:
num=7 name=node num=0 name=node num=5 name=node num=9 name=node num=6 name=node num=3 name=node num=4 name=node num=8 name=node num=1 name=node num=2 name=node
現在輸出是亂序的,接下來我們使用 Collections.sort 對其進行排序。
public class MyTest {
public static void main(String[] args) {
List<Node> list = new ArrayList<Node>();
for(int i = 0;i < 10;i++) {
list.add(new Node(i,"node"));
}
//打亂順序
Collections.shuffle(list);
Collections.sort(list);
for (Node node : list) {
System.out.println(node);
}
}
}Collections.sort 其實是按 compareTo 方法中的定義進行比較,我們之前定義了按照 num 的升序進行排序,現在排序結果如下:
num=0 name=node num=1 name=node num=2 name=node num=3 name=node num=4 name=node num=5 name=node num=6 name=node num=7 name=node num=8 name=node num=9 name=node
總結
Comparable 是內比較器,Comparator 是外比較器,若類沒有實現 Comparable 接口但是需要對其進行排序,我們可以考慮使用 Comparator 。從另一個角度看,使用 Comparable 接口的耦合性大于 Comparator ,因為當我們需要對比較算法進行修改的時候還需要修改 Comparable 的實現類。
關于java中的comparable與Comparator的區別就分享到這里了,希望以上內容可以對大家有一定的幫助,可以學到更多知識。如果覺得文章不錯,可以把它分享出去讓更多的人看到。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。