JAVA中compareTo方法的使用小結
一、compareTo()方法
在深挖compareTo方法前,首先我們需要了解compareTo方法的來龍去脈。compareTo方法的目的是用來比較兩個對象的大小的。假如有兩個對象a1,a2。包含姓名,年齡,身高三個屬性,現在要求根據年齡或者性別進行排序。這就要用到compareTo方法。
二、如何使用compareTo方法
要想使用compareTo方法對對象進行排序,首先要使得該對象類實現comparable接口,并重寫compareTo方法,重寫compareTo方法時要制定比較規(guī)則。
package com.njau.d6_map_impl; import java.util.Objects; public class Student implements Comparable<Student>{ private String name; private int age; private double height; public Student(String name, int age, double height) { this.name = name; this.age = age; this.height = height; } @Override public int compareTo(Student o) { return this.age-o.age; } @Override public boolean equals(Object o) { if (this == o) return true; if (o == null || getClass() != o.getClass()) return false; Student student = (Student) o; return age == student.age && Double.compare(height, student.height) == 0 && Objects.equals(name, student.name); } @Override public int hashCode() { return Objects.hash(name, age, height); // 沒有重寫hashCode之前,不同對象不一樣。重寫后根據屬性計算hash值,屬性相同的被認為是同一對象,hash值一樣。屬性是否一樣通過重寫的equals方法判斷 } public Student() { } public String getName() { return name; } public void setName(String name) { this.name = name; } public int getAge() { return age; } public void setAge(int age) { this.age = age; } public double getHeight() { return height; } public void setHeight(double height) { this.height = height; } @Override public String toString() { return "Student{" + "name='" + name + '\'' + ", age=" + age + ", height=" + height + '}'; } }
三、如何指定比較規(guī)則
那么該如何指定比較規(guī)則呢?這里主要針對int類型數據比較,double類型數據比較以及字符串類型數據比較三種來講解比較規(guī)則:
1.int類型數據比較
int類型的數據指定比較規(guī)則最為簡單,在重寫compareTo方法時,this代表主調對象(主動比較對象),而o代表從調對象(被動比較對象)。Java會默認左邊對象是主調對象(this對象),右邊對象是從調對象(o對象),這個默認規(guī)則是不會改變的。
而比較規(guī)則是:當左邊對象>右邊對象的值時,compareTo方法會返回一個正整數。Java便認為是this對象>o對象(因為Java會默認左邊對象就是this,右邊對象就是o)。Java排序o,this。
當左邊對象<右邊對象的值時,compareTo方法會返回一個負整數。Java便認為是this對象<o對象(因為Java會默認左邊對象就是this,右邊對象就是o)。Java排序this,o。
當左邊對象=右邊對象的值時,compareTo方法會返回一個負整數。Java便認為是this對象=o對象(因為Java會默認左邊對象就是this,右邊對象就是o)。
舉例說明
package com.njau.d6_map_impl; import java.util.Objects; public class Student implements Comparable<Student>{ private String name; private int age; private double height; public Student(String name, int age, double height) { this.name = name; this.age = age; this.height = height; } @Override public int compareTo(Student o) { return this.age-o.age; } @Override public boolean equals(Object o) { if (this == o) return true; if (o == null || getClass() != o.getClass()) return false; Student student = (Student) o; return age == student.age && Double.compare(height, student.height) == 0 && Objects.equals(name, student.name); } @Override public int hashCode() { return Objects.hash(name, age, height); // 沒有重寫hashCode之前,不同對象不一樣。重寫后根據屬性計算hash值,屬性相同的被認為是同一對象,hash值一樣。屬性是否一樣通過重寫的equals方法判斷 } public Student() { } public String getName() { return name; } public void setName(String name) { this.name = name; } public int getAge() { return age; } public void setAge(int age) { this.age = age; } public double getHeight() { return height; } public void setHeight(double height) { this.height = height; } @Override public String toString() { return "Student{" + "name='" + name + '\'' + ", age=" + age + ", height=" + height + '}'; } }
假設this.age>o.age
this.age-o.age。左邊this右邊o,>0則Java則認為左邊對象this>右邊對象o,則排序為o,this。升序排序。實際上也是升序排序。
如果想要降序排序,那么則改為o.age-this.age。左邊o右邊this,<0則Java則認為左邊對象this<右邊對象o,則排序為this,o。Java認為是升序排序。實際上是降序排序。
2.double類型數據比較
double類型的數據比較,會出現精度問題,因此不能直接相減。為了解決精度問題,Java中的Double.compare方法派上用場。Double.compare(double1,double2),如果double1>double2,則返回正整數。如果double1<double2,則返回負整數。如果double1=double2,則返回0。這樣的話,就符合了Java的比較規(guī)則。
return Double.compare(o1.getHeight(),o2.getHeight());
3.字符串類型的數據比較
return this.name.compareTo(o.name);
字符串類型的屬性進行比較時,會將字符串轉換成字符數組,再通過字符數組進行比較,排序時按照字符的Unicode編碼進行排序。首先Java虛擬機會將主調字符串(由編譯時生成,也叫做value[])賦給String類中定義的value[]字符數組(使用final定義,只能初始化一次)。
public final class String implements java.io.Serializable, Comparable<String>, CharSequence { // The value is used for character storage. private final char value[]; // Other fields and methods... // Constructor to initialize string from character array public String(char value[]) { this.value = Arrays.copyOf(value, value.length); } // Other constructors and methods... }
緊接著會執(zhí)行String類中的compareTo方法,將從調字符串進行傳入并比較
public int compareTo(String anotherString) { int len1 = this.length(); int len2 = anotherString.length(); int lim = Math.min(len1, len2); char v1[] = this.value; char v2[] = anotherString.value; int k = 0; while (k < lim) { char c1 = v1[k]; char c2 = v2[k]; if (c1 != c2) { return c1 - c2; } k++; } return len1 - len2; }
this:主調字符串
anotherString:從調字符串(在編譯階段會被轉換成字符數組)
原理:
獲取字符串長度:
int len1 = this.length(); int len2 = anotherString.length();
length()
方法返回字符串的長度
將字符串轉換為字符數組:
char v1[] = this.toCharArray(); char v2[] = anotherString.toCharArray();
toCharArray()
方法將字符串轉換為字符數組。
逐字符比較:
int k = 0; while (k < lim) { char c1 = v1[k]; char c2 = v2[k]; if (c1 != c2) { return c1 - c2; } k++; }
逐字符比較兩個字符串,返回第一個不同字符的差值。
長度比較:
return len1 - len2;
如果所有字符都相同,則返回字符串長度的差值。
最終會根據Unicode編碼比較出字符串的前后順序。
到此這篇關于JAVA中compareTo方法的使用小結的文章就介紹到這了,更多相關JAVA compareTo內容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!
- Java中compareTo方法使用小結
- Java中BigDecimal的equals方法和compareTo方法的區(qū)別詳析
- Java中BigDecimal比較大小的3種方法(??compareTo()、??equals()??和??compareTo()??)
- Java compareTo用法詳解
- JavaSE中compare、compareTo的區(qū)別
- Java 基礎:string中的compareTo方法
- java compare compareTo方法區(qū)別詳解
- java compareTo和compare方法比較詳解
- java使用compareTo實現一個類的對象之間比較大小操作
- Java中替代equals,compareTo和toString的方法
- Java中比較運算符compareTo()、equals()與==的區(qū)別及應用總結
- 詳解java中保持compareTo和equals同步
相關文章
基于spring-boot-maven-plugin插件打包lib文件外置的方法(layout模式為ZIP模式)
Maven是一個插件執(zhí)行框架,所有工作都由插件完成,同時?Maven?基于構建生命周期的核心概念,明確定義了構建和分發(fā)特定工件(項目)的過程,接下來通過本文給大家介紹下基于spring-boot-maven-plugin插件打包lib文件外置(layout模式為ZIP模式),需要的朋友可以參考下2022-09-09springboot+maven多環(huán)境動態(tài)配置及編譯失敗的解決方案(步驟詳解)
這篇文章主要介紹了springboot+maven多環(huán)境動態(tài)配置及編譯失敗的解決方案,本文通過實例圖文相結合給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友參考下吧2023-11-11maven package 打包報錯 Failed to execute goal的解決
這篇文章主要介紹了maven package 打包報錯 Failed to execute goal的解決,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧2020-11-11透徹理解Java中Synchronized(對象鎖)和Static Synchronized(類鎖)的區(qū)別
這篇文章主要介紹了Java中Synchronized(對象鎖)和Static Synchronized(類鎖)的區(qū)別,希望對大家有所幫助,一起跟隨小編過來看看吧2018-05-05spring-data-elasticsearch @Field注解無效的完美解決方案
這篇文章主要介紹了spring-data-elasticsearch @Field注解無效的完美解決方案,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2021-07-07詳解SpringBoot 創(chuàng)建定時任務(配合數據庫動態(tài)執(zhí)行)
本篇文章主要介紹了SpringBoot 創(chuàng)建定時任務(配合數據庫動態(tài)執(zhí)行),小編覺得挺不錯的,現在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧2017-10-10