在Java中常常會涉及到對象數組的排序問題,那麼就涉及到對象之間的比較問題。java
一般對象之間的比較能夠從兩個方面去看:算法
第一個方面:對象的地址是否同樣,也就是是否引用自同一個對象。這種方式能夠直接使用「==「來完成。數組
第二個方面:以對象的某一個屬性的角度去比較。ide
對於JDK8而言,有三種實現對象比較的方法:函數
一、覆寫Object類的equals()方法;this
二、繼承Comparable接口,並實現compareTo()方法;spa
三、定義一個單獨的對象比較器,繼承自Comparator接口,實現compare()方法。code
因爲使用的排序方式的不一樣,具體選擇哪一種方法來實現對象的比較也會有所不一樣。對象
第一種方法比較便於理解,複寫equals()方法通常用於本身實現的對象數組排序,而對於在應用Java內置的排序算法時,使用後兩種方式都是能夠實現的。blog
先來看一下第二種方式,這種方式就是讓本身編寫的類繼承Comparable接口,並實現接口的compareTo()方法,這種狀況下,在使用java.util.Arrays.sort()方法時不用指定具體的比較器,sort()方法會使用對象本身的比較函數對對象進行排序。具體實例代碼以下:
1 import java.util.Arrays; 2 3 class BookCook implements Comparable<BookCook>{ 4 private String title; 5 private double price; 6 public BookCook(String title,double price){ 7 this.title = title; 8 this.price = price; 9 } 10 @Override 11 public String toString() { 12 return "書名:"+this.title+",價格:"+this.price; 13 } 14 @Override 15 public int compareTo(BookCook o) { 16 if(this.price > o.price){ 17 return 1; 18 }else if(this.price < o.price){ 19 return -1; 20 }else{ 21 return 0; 22 } 23 } 24 }
從JDK1.8開始出現了Comparator接口,它的出現解決了當須要在已經開發好的代碼基礎上完善對象的比較功能時不想更改以前的代碼的問題。這種狀況,咱們須要單獨定義一個對象比較器,繼承Comparator接口。具體實現代碼以下:
1 class Student { 2 private String name; 3 private double score; 4 public Student(String name,double score){ 5 this.name = name; 6 this.score = score; 7 } 8 public double getScore(){ 9 return this.score; 10 } 11 @Override 12 public String toString() { 13 return "姓名:"+this.name+",分數:"+this.score; 14 } 15 16 } 17 class StudentComparator implements Comparator<Student> { 18 @Override 19 public int compare(Student o1,Student o2) { 20 if(o1.getScore() > o2.getScore()){ 21 return 1; 22 }else if(o1.getScore() < o2.getScore()){ 23 return -1; 24 }else{ 25 return 0; 26 } 27 } 28 } 29 public class TestComparator { 30 31 public static void main(String[] args) { 32 33 Student[] sts = new Student[]{ 34 new Student("小戴",60), 35 new Student("小王",90), 36 new Student("老王",80), 37 new Student("小萱",95) 38 }; 39 40 java.util.Arrays.sort(sts, new StudentComparator()); 41 System.out.println(java.util.Arrays.toString(sts)); 42 } 43 }
以上三種狀況,因具體狀況的不一樣,選擇不一樣的方法解決實際的問題。