欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

JAVA中compareTo方法的使用小結(jié)

 更新時(shí)間:2024年07月09日 09:47:30   作者:天上掉下來個(gè)程小白  
compareTo方法的目的是用來比較兩個(gè)對(duì)象的大小的,本文主要介紹了JAVA中compareTo方法的使用小結(jié),具有一定的參考價(jià)值,感興趣的可以了解一下

一、compareTo()方法

在深挖compareTo方法前,首先我們需要了解compareTo方法的來龍去脈。compareTo方法的目的是用來比較兩個(gè)對(duì)象的大小的。假如有兩個(gè)對(duì)象a1,a2。包含姓名,年齡,身高三個(gè)屬性,現(xiàn)在要求根據(jù)年齡或者性別進(jìn)行排序。這就要用到compareTo方法。

二、如何使用compareTo方法

要想使用compareTo方法對(duì)對(duì)象進(jìn)行排序,首先要使得該對(duì)象類實(shí)現(xiàn)comparable接口,并重寫compareTo方法,重寫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);   // 沒有重寫hashCode之前,不同對(duì)象不一樣。重寫后根據(jù)屬性計(jì)算hash值,屬性相同的被認(rèn)為是同一對(duì)象,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ī)則呢?這里主要針對(duì)int類型數(shù)據(jù)比較,double類型數(shù)據(jù)比較以及字符串類型數(shù)據(jù)比較三種來講解比較規(guī)則:

1.int類型數(shù)據(jù)比較

int類型的數(shù)據(jù)指定比較規(guī)則最為簡(jiǎn)單,在重寫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)。

舉例說明

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之前,不同對(duì)象不一樣。重寫后根據(jù)屬性計(jì)算hash值,屬性相同的被認(rèn)為是同一對(duì)象,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 +
                '}';
    }
}

假設(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類型數(shù)據(jù)比較

double類型的數(shù)據(jù)比較,會(huì)出現(xià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.字符串類型的數(shù)據(jù)比較

return this.name.compareTo(o.name);

字符串類型的屬性進(jìn)行比較時(shí),會(huì)將字符串轉(zhuǎn)換成字符數(shù)組,再通過字符數(shù)組進(jìn)行比較,排序時(shí)按照字符的Unicode編碼進(jìn)行排序。首先Java虛擬機(jī)會(huì)將主調(diào)字符串(由編譯時(shí)生成,也叫做value[])賦給String類中定義的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類中的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)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • 基于spring-boot-maven-plugin插件打包lib文件外置的方法(layout模式為ZIP模式)

    基于spring-boot-maven-plugin插件打包lib文件外置的方法(layout模式為ZIP模式)

    Maven是一個(gè)插件執(zhí)行框架,所有工作都由插件完成,同時(shí)?Maven?基于構(gòu)建生命周期的核心概念,明確定義了構(gòu)建和分發(fā)特定工件(項(xiàng)目)的過程,接下來通過本文給大家介紹下基于spring-boot-maven-plugin插件打包lib文件外置(layout模式為ZIP模式),需要的朋友可以參考下
    2022-09-09
  • springboot+maven多環(huán)境動(dòng)態(tài)配置及編譯失敗的解決方案(步驟詳解)

    springboot+maven多環(huán)境動(dòng)態(tài)配置及編譯失敗的解決方案(步驟詳解)

    這篇文章主要介紹了springboot+maven多環(huán)境動(dòng)態(tài)配置及編譯失敗的解決方案,本文通過實(shí)例圖文相結(jié)合給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友參考下吧
    2023-11-11
  • JDBC用法小結(jié)

    JDBC用法小結(jié)

    這篇文章主要介紹了JDBC用法,較為詳細(xì)的分析了基于JDBC進(jìn)行數(shù)據(jù)庫操作的技巧,具有一定參考借鑒價(jià)值,需要的朋友可以參考下
    2014-12-12
  • maven package 打包報(bào)錯(cuò) Failed to execute goal的解決

    maven package 打包報(bào)錯(cuò) Failed to execute goal的解決

    這篇文章主要介紹了maven package 打包報(bào)錯(cuò) Failed to execute goal的解決,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2020-11-11
  • SpringBoot集成ECDH密鑰交換的方法

    SpringBoot集成ECDH密鑰交換的方法

    ECDH密鑰交換算法通過橢圓曲線和Diffie-Hellman方法生成共享密鑰,用于前端和后端之間的AES加密通信,前端使用elliptic.js生成密鑰對(duì),后端使用crypto-js.min.js進(jìn)行AES加密,本文給大家介紹SpringBoot集成ECDH密鑰交換的相關(guān)知識(shí),感興趣的朋友一起看看吧
    2025-01-01
  • 透徹理解Java中Synchronized(對(duì)象鎖)和Static Synchronized(類鎖)的區(qū)別

    透徹理解Java中Synchronized(對(duì)象鎖)和Static Synchronized(類鎖)的區(qū)別

    這篇文章主要介紹了Java中Synchronized(對(duì)象鎖)和Static Synchronized(類鎖)的區(qū)別,希望對(duì)大家有所幫助,一起跟隨小編過來看看吧
    2018-05-05
  • spring-data-elasticsearch @Field注解無效的完美解決方案

    spring-data-elasticsearch @Field注解無效的完美解決方案

    這篇文章主要介紹了spring-data-elasticsearch @Field注解無效的完美解決方案,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2021-07-07
  • @FeignClient之name,value,url詳解

    @FeignClient之name,value,url詳解

    在FeignClient中,`name`用于指定服務(wù)的名稱,通常與服務(wù)注冊(cè)中心中的服務(wù)名關(guān)聯(lián),而`url`用于指定請(qǐng)求的基礎(chǔ)URL,適用于不使用服務(wù)注冊(cè)的場(chǎng)景,如果同時(shí)配置了`name`和`url`,則`url`會(huì)優(yōu)先生效,Feign會(huì)直接使用`url`指定的地址
    2024-11-11
  • Java 深入淺出掌握Collection單列集合Set

    Java 深入淺出掌握Collection單列集合Set

    Collection集合類是單列集合類的根接口,用來存儲(chǔ)一系列符合某種規(guī)則的元素。List接口和Set接口是Collection集合類的子接口,其中List接口的常用實(shí)現(xiàn)類有ArrayList類、Vector類和LinkedList類;Set接口的常用實(shí)現(xiàn)類有HashSet類和TreeSet類
    2021-11-11
  • 詳解SpringBoot 創(chuàng)建定時(shí)任務(wù)(配合數(shù)據(jù)庫動(dòng)態(tài)執(zhí)行)

    詳解SpringBoot 創(chuàng)建定時(shí)任務(wù)(配合數(shù)據(jù)庫動(dòng)態(tài)執(zhí)行)

    本篇文章主要介紹了SpringBoot 創(chuàng)建定時(shí)任務(wù)(配合數(shù)據(jù)庫動(dòng)態(tài)執(zhí)行),小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧
    2017-10-10

最新評(píng)論