comparator接口与Comparable接口的区别
生活随笔
收集整理的這篇文章主要介紹了
comparator接口与Comparable接口的区别
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
Comparable & Comparator 都是用來實現集合中元素的比較、排序的,只是 Comparable 是在集合內部定義的方法實現的排序,Comparator 是在集合外部實現的排序,所以,如想實現排序,就需要在集合外定義 Comparator 接口的方法或在集合內實現 Comparable 接口的方法。
Comparator位于包java.util下,而Comparable位于包?? java.lang下
Comparable 是一個對象本身就已經支持自比較所需要實現的接口(如 String、Integer 自己就可以完成比較大小操作,已經實現了Comparable接口)? ?
自定義的類要在加入list容器中后能夠排序,可以實現Comparable接口,在用Collections類的sort方法排序時,如果不指定Comparator,那么就以自然順序排序,如API所說:
Sorts the specified list into ascending order, according to the natural ordering of its elements. All elements in the list must implement the Comparable interface
這里的自然順序就是實現Comparable接口設定的排序方式。
而 Comparator 是一個專用的比較器,當這個對象不支持自比較或者自比較函數不能滿足你的要求時,你可以寫一個比較器來完成兩個對象之間大小的比較。
??
可以說一個是自已完成比較,一個是外部程序實現比較的差別而已。
Comparator位于包java.util下,而Comparable位于包?? java.lang下
Comparable 是一個對象本身就已經支持自比較所需要實現的接口(如 String、Integer 自己就可以完成比較大小操作,已經實現了Comparable接口)? ?
自定義的類要在加入list容器中后能夠排序,可以實現Comparable接口,在用Collections類的sort方法排序時,如果不指定Comparator,那么就以自然順序排序,如API所說:
Sorts the specified list into ascending order, according to the natural ordering of its elements. All elements in the list must implement the Comparable interface
這里的自然順序就是實現Comparable接口設定的排序方式。
而 Comparator 是一個專用的比較器,當這個對象不支持自比較或者自比較函數不能滿足你的要求時,你可以寫一個比較器來完成兩個對象之間大小的比較。
??
可以說一個是自已完成比較,一個是外部程序實現比較的差別而已。
用 Comparator 是策略模式(strategy design pattern),就是不改變對象自身,而用一個策略對象(strategy object)來改變它的行為。
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 的區別ComparableComparable 定義在 Person類的內部:public class Persion implements Comparable {..比較Person的大小..},因為已經實現了比較器,那么我們的Person現在是一個可以比較大小的對象了,它的比較功能和String完全一樣,可以隨時隨地的拿來 比較大小,因為Person現在自身就是有大小之分的。Collections.sort(personList)可以得到正確的結果。ComparatorComparator 是定義在Person的外部的, 此時我們的Person類的結構不需要有任何變化,如public class Person{ String name; int age },然后我們另外定義一個比較器:public PersonComparator implements Comparator() {..比較Person的大小..},在PersonComparator里面實現了怎么比較兩個Person的大小. 所以,用這種方法,當我們要對一個 personList進行排序的時候, 我們除了了要傳遞personList過去, 還需要把PersonComparator傳遞過去,因為怎么比較Person的大小是在PersonComparator 里面實現的, 如:Collections.sort( personList , new PersonComparator() ).3. Comparator 和 Comparable 的實例Comparable:實現Comparable接口要覆蓋compareTo方法, 在compareTo方法里面實現比較: public class Person implements Comparable {String name;int agepublic 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 方法: public class Person{String name;int age }class PersonComparator implements Comparator { 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 里面用戶可以自 己實現復雜的可以通用的邏輯,使其可以匹配一些比較簡單的對象,那樣就可以節省很多重復勞動了。
轉載于:https://www.cnblogs.com/chaoyu/p/6436982.html
總結
以上是生活随笔為你收集整理的comparator接口与Comparable接口的区别的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Python在信号与系统(1)——Hil
- 下一篇: Window 通过cmd查看端口占用、相