JAVA中compareTo方法的使用小結(jié)
一、compareTo()方法
在深挖compareTo方法前,首先我們需要了解compareTo方法的來(lái)龍去脈。compareTo方法的目的是用來(lái)比較兩個(gè)對(duì)象的大小的。假如有兩個(gè)對(duì)象a1,a2。包含姓名,年齡,身高三個(gè)屬性,現(xiàn)在要求根據(jù)年齡或者性別進(jìn)行排序。這就要用到compareTo方法。
二、如何使用compareTo方法
要想使用compareTo方法對(duì)對(duì)象進(jìn)行排序,首先要使得該對(duì)象類(lèi)實(shí)現(xiàn)comparable接口,并重寫(xiě)compareTo方法,重寫(xiě)compareTo方法時(shí)要制定比較規(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); // 沒(méi)有重寫(xiě)hashCode之前,不同對(duì)象不一樣。重寫(xiě)后根據(jù)屬性計(jì)算hash值,屬性相同的被認(rèn)為是同一對(duì)象,hash值一樣。屬性是否一樣通過(guò)重寫(xiě)的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ī)則呢?這里主要針對(duì)int類(lèi)型數(shù)據(jù)比較,double類(lèi)型數(shù)據(jù)比較以及字符串類(lèi)型數(shù)據(jù)比較三種來(lái)講解比較規(guī)則:
1.int類(lèi)型數(shù)據(jù)比較
int類(lèi)型的數(shù)據(jù)指定比較規(guī)則最為簡(jiǎn)單,在重寫(xiě)compareTo方法時(shí),this代表主調(diào)對(duì)象(主動(dòng)比較對(duì)象),而o代表從調(diào)對(duì)象(被動(dòng)比較對(duì)象)。Java會(huì)默認(rèn)左邊對(duì)象是主調(diào)對(duì)象(this對(duì)象),右邊對(duì)象是從調(diào)對(duì)象(o對(duì)象),這個(gè)默認(rèn)規(guī)則是不會(huì)改變的。
而比較規(guī)則是:當(dāng)左邊對(duì)象>右邊對(duì)象的值時(shí),compareTo方法會(huì)返回一個(gè)正整數(shù)。Java便認(rèn)為是this對(duì)象>o對(duì)象(因?yàn)镴ava會(huì)默認(rèn)左邊對(duì)象就是this,右邊對(duì)象就是o)。Java排序o,this。
當(dāng)左邊對(duì)象<右邊對(duì)象的值時(shí),compareTo方法會(huì)返回一個(gè)負(fù)整數(shù)。Java便認(rèn)為是this對(duì)象<o(jì)對(duì)象(因?yàn)镴ava會(huì)默認(rèn)左邊對(duì)象就是this,右邊對(duì)象就是o)。Java排序this,o。
當(dāng)左邊對(duì)象=右邊對(duì)象的值時(shí),compareTo方法會(huì)返回一個(gè)負(fù)整數(shù)。Java便認(rèn)為是this對(duì)象=o對(duì)象(因?yàn)镴ava會(huì)默認(rèn)左邊對(duì)象就是this,右邊對(duì)象就是o)。
舉例說(shuō)明
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); // 沒(méi)有重寫(xiě)hashCode之前,不同對(duì)象不一樣。重寫(xiě)后根據(jù)屬性計(jì)算hash值,屬性相同的被認(rèn)為是同一對(duì)象,hash值一樣。屬性是否一樣通過(guò)重寫(xiě)的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 +
'}';
}
}
假設(shè)this.age>o.age
this.age-o.age。左邊this右邊o,>0則Java則認(rèn)為左邊對(duì)象this>右邊對(duì)象o,則排序?yàn)閛,this。升序排序。實(shí)際上也是升序排序。
如果想要降序排序,那么則改為o.age-this.age。左邊o右邊this,<0則Java則認(rèn)為左邊對(duì)象this<右邊對(duì)象o,則排序?yàn)閠his,o。Java認(rèn)為是升序排序。實(shí)際上是降序排序。
2.double類(lèi)型數(shù)據(jù)比較
double類(lèi)型的數(shù)據(jù)比較,會(huì)出現(xiàn)精度問(wèn)題,因此不能直接相減。為了解決精度問(wèn)題,Java中的Double.compare方法派上用場(chǎng)。Double.compare(double1,double2),如果double1>double2,則返回正整數(shù)。如果double1<double2,則返回負(fù)整數(shù)。如果double1=double2,則返回0。這樣的話,就符合了Java的比較規(guī)則。
return Double.compare(o1.getHeight(),o2.getHeight());
3.字符串類(lèi)型的數(shù)據(jù)比較
return this.name.compareTo(o.name);
字符串類(lèi)型的屬性進(jìn)行比較時(shí),會(huì)將字符串轉(zhuǎn)換成字符數(shù)組,再通過(guò)字符數(shù)組進(jìn)行比較,排序時(shí)按照字符的Unicode編碼進(jìn)行排序。首先Java虛擬機(jī)會(huì)將主調(diào)字符串(由編譯時(shí)生成,也叫做value[])賦給String類(lèi)中定義的value[]字符數(shù)組(使用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...
}
緊接著會(huì)執(zhí)行String類(lèi)中的compareTo方法,將從調(diào)字符串進(jìn)行傳入并比較
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:主調(diào)字符串
anotherString:從調(diào)字符串(在編譯階段會(huì)被轉(zhuǎn)換成字符數(shù)組)
原理:
獲取字符串長(zhǎng)度:
int len1 = this.length(); int len2 = anotherString.length();
length() 方法返回字符串的長(zhǎng)度
將字符串轉(zhuǎn)換為字符數(shù)組:
char v1[] = this.toCharArray(); char v2[] = anotherString.toCharArray();
toCharArray() 方法將字符串轉(zhuǎn)換為字符數(shù)組。
逐字符比較:
int k = 0;
while (k < lim) {
char c1 = v1[k];
char c2 = v2[k];
if (c1 != c2) {
return c1 - c2;
}
k++;
}
逐字符比較兩個(gè)字符串,返回第一個(gè)不同字符的差值。
長(zhǎng)度比較:
return len1 - len2;
如果所有字符都相同,則返回字符串長(zhǎng)度的差值。
最終會(huì)根據(jù)Unicode編碼比較出字符串的前后順序。
到此這篇關(guān)于JAVA中compareTo方法的使用小結(jié)的文章就介紹到這了,更多相關(guān)JAVA compareTo內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
- Java中compareTo方法使用小結(jié)
- Java中BigDecimal的equals方法和compareTo方法的區(qū)別詳析
- Java中BigDecimal比較大小的3種方法(??compareTo()、??equals()??和??compareTo()??)
- Java compareTo用法詳解
- JavaSE中compare、compareTo的區(qū)別
- Java 基礎(chǔ):string中的compareTo方法
- java compare compareTo方法區(qū)別詳解
- java compareTo和compare方法比較詳解
- java使用compareTo實(shí)現(xiàn)一個(gè)類(lèi)的對(duì)象之間比較大小操作
- Java中替代equals,compareTo和toString的方法
- Java中比較運(yùn)算符compareTo()、equals()與==的區(qū)別及應(yīng)用總結(jié)
- 詳解java中保持compareTo和equals同步
相關(guān)文章
Spring IOC (DI) 依賴(lài)注入的四種方式示例詳解
這篇文章主要介紹了Spring IOC (DI) 依賴(lài)注入的四種方式,本文通過(guò)實(shí)例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2023-06-06
Java接口方法默認(rèn)靜態(tài)實(shí)現(xiàn)代碼實(shí)例
這篇文章主要介紹了Java接口方法默認(rèn)靜態(tài)實(shí)現(xiàn),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2020-06-06
Java漢字轉(zhuǎn)成漢語(yǔ)拼音工具類(lèi)
這篇文章主要為大家詳細(xì)介紹了Java漢字轉(zhuǎn)成漢語(yǔ)拼音工具類(lèi),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2017-05-05
java使用CollectionUtils工具類(lèi)判斷集合是否為空方式
這篇文章主要介紹了java使用CollectionUtils工具類(lèi)判斷集合是否為空方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2022-02-02
ServletContext讀取web資源_動(dòng)力節(jié)點(diǎn)Java學(xué)院整理
這篇文章主要介紹了ServletContext讀取web資源,小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2017-07-07
Springboot FeignClient調(diào)用Method has too m
本文主要介紹了Springboot FeignClient微服務(wù)間調(diào)用Method has too many Body parameters 解決,文中通過(guò)示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2021-12-12
idea搭建mybatis環(huán)境配置全過(guò)程
本文介紹了如何以IDEA搭建MyBatis環(huán)境配置的方法,包括步驟和注意事項(xiàng),通過(guò)本文的介紹,可以輕松地以IDEA搭建MyBatis環(huán)境配置,提高開(kāi)發(fā)效率2023-10-10

