激情久久久_欧美视频区_成人av免费_不卡视频一二三区_欧美精品在欧美一区二区少妇_欧美一区二区三区的

服務器之家:專注于服務器技術及軟件下載分享
分類導航

PHP教程|ASP.NET教程|JAVA教程|ASP教程|

香港云服务器
服務器之家 - 編程語言 - JAVA教程 - 淺析Java中comparator接口與Comparable接口的區別

淺析Java中comparator接口與Comparable接口的區別

2020-06-20 11:44天盡頭的那片海 JAVA教程

本文要來詳細分析一下Java中Comparable和Comparator接口的區別,兩者都有比較的功能,那么究竟有什么區別呢,感興趣的Java開發者繼續看下去吧

Comparable 簡介

Comparable 是排序接口

若一個類實現了Comparable接口,就意味著“該類支持排序”。  即然實現Comparable接口的類支持排序,假設現在存在“實現Comparable接口的類的對象的List列表(或數組)”,則該List列表(或數組)可以通過 Collections.sort(或 Arrays.sort)進行排序。

此外,“實現Comparable接口的類的對象”可以用作“有序映射(如TreeMap)”中的鍵或“有序集合(TreeSet)”中的元素,而不需要指定比較器。

1. Comparator 和 Comparable 相同的地方

他們都是java的一個接口, 并且是用來對自定義的class比較大小的,

什么是自定義class: 如 public class Person{ String name; int age }.

當我們有這么一個personList,里面包含了person1, person2, persion3....., 我們用Collections.sort( personList ),
是得不到預期的結果的. 這時肯定有人要問, 那為什么可以排序一個字符串list呢:

如 StringList{"hello1" , "hello3" , "hello2"}, Collections.sort( stringList ) 能夠得到正確的排序, 那是因為
String 這個對象已經幫我們實現了 Comparable接口 , 所以我們的 Person 如果想排序, 也要實現一個比較器。

2. Comparator 和 Comparable 的區別

Comparable

Comparable 定義在 Person類的內部:

public class Persion implements Comparable {..比較Person的大小..},

因為已經實現了比較器,那么我們的Person現在是一個可以比較大小的對象了,它的比較功能和String完全一樣,可以隨時隨地的拿來
比較大小,因為Person現在自身就是有大小之分的。Collections.sort(personList)可以得到正確的結果。

Comparator

Comparator 是定義在Person的外部的, 此時我們的Person類的結構不需要有任何變化,如

?
1
public class Person{ String name; int age },

然后我們另外定義一個比較器:

?
1
public PersonComparator implements Comparator() {..比較Person的大小..},

在PersonComparator里面實現了怎么比較兩個Person的大小. 所以,用這種方法,當我們要對一個 personList進行排序的時候,
我們除了了要傳遞personList過去, 還需要把PersonComparator傳遞過去,因為怎么比較Person的大小是在PersonComparator
里面實現的, 如:

?
1
Collections.sort( personList , new PersonComparator() ).

3. Comparator 和 Comparable 的實例

Comparable:

實現Comparable接口要覆蓋compareTo方法, 在compareTo方法里面實現比較:

?
1
2
3
4
5
6
7
8
9
10
11
12
13
public class Person implements Comparable {
String name;
int age;
public int compareTo(Person another) {
int i = 0;
i = name.compareTo(another.name); // 使用字符串的比較
if(i == 0) { // 如果名字一樣,比較年齡, 返回比較年齡結果
return age - another.age;
} else {
return i; // 名字不一樣, 返回比較名字的結果.
}
}
}

這時我們可以直接用 Collections.sort( personList ) 對其排序了.

Comparator:

實現Comparator需要覆蓋 compare 方法:

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
public class Person{
String name;
int age;
}
class PersonComparator implements Comparator<Person> {
public int compare(Person one, Person another) {
int i = 0;
i = one.name.compareTo(another.name); // 使用字符串的比較
if(i == 0) { // 如果名字一樣,比較年齡,返回比較年齡結果
return one.age - another.age;
} else {
return i; // 名字不一樣, 返回比較名字的結果.
}
}
}
Collections.sort( personList , new PersonComparator()) 可以對其排序

4:總結

兩種方法各有優劣, 用Comparable 簡單, 只要實現Comparable 接口的對象直接就成為一個可以比較的對象,
但是需要修改源代碼, 用Comparator 的好處是不需要修改源代碼, 而是另外實現一個比較器, 當某個自定義
的對象需要作比較的時候,把比較器和對象一起傳遞過去就可以比大小了, 并且在Comparator 里面用戶可以自
己實現復雜的可以通用的邏輯,使其可以匹配一些比較簡單的對象,那樣就可以節省很多重復勞動了。

原文鏈接:http://www.cnblogs.com/zhangzongle/archive/2016/10/01/5925762.html

延伸 · 閱讀

精彩推薦
580
主站蜘蛛池模板: 成人黄色小视频网站 | 亚洲一区二区三区四区精品 | 亚洲电影在线观看高清免费 | 国产精品高潮99久久久久久久 | 日本大片在线播放 | 一级国产精品一级国产精品片 | 毛片电影网址 | 国产日韩久久久久69影院 | 日韩美香港a一级毛片 | 免费在线观看国产精品 | 九九热精品在线视频 | 精品国产一级毛片 | 日本a∨精品中文字幕在线 狠狠干精品视频 | 国产高潮好爽受不了了夜色 | 午夜a狂野欧美一区二区 | 中文字幕在线观看二区 | 800av凹凸| 国产亚洲精品综合一区91 | 男女羞羞视频在线免费观看 | 成人黄色免费网站 | 久久精品国产清自在天天线 | 国产精品亚洲欧美一级在线 | 叶子楣成人爽a毛片免费啪啪 | 大学生一级毛片在线视频 | 日日狠狠久久偷偷四色综合免费 | 国产亚洲精品久久久久久久 | 欧美一级做a | 日本一区二区免费在线播放 | 国产一区二区三区手机在线 | 免看黄大片aa | 在线中文字幕不卡 | 日日草夜夜操 | 日本精品视频一区二区三区四区 | 欧美日韩大片在线观看 | 欧美老逼| 欧美日韩在线播放一区 | 成人免费毛片在线观看 | 激情视频在线播放 | 国产一级做a爱片在线看免 日日草夜夜 | 久久色在线 | 精品国产一区二区久久 |