最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

JAVA中對象常見的幾種方法比較

 更新時間:2026年01月09日 08:47:46   作者:第六章初  
這篇文章主要介紹了JAVA中對象常見的幾種方法比較,包括基本元素的==和equals()比較、自定義對象的equals()+hashCode()實現(xiàn)、Comparable接口的compareTo方法實現(xiàn)、Comparator接口的compare方法實現(xiàn)等,需要的朋友可以參考下

引言

  • 對象比較是 Java 編程中基礎(chǔ)且核心的能力,它直接關(guān)系到集合元素的查找、排序、去重,以及業(yè)務(wù)邏輯中對象相等性的判斷,是保證程序邏輯正確性和數(shù)據(jù)一致性的關(guān)鍵環(huán)節(jié)。
  • 今天就帶分享幾個常見的幾種比較,全文無尿點,讓我們開始吧~

基本元素比較

Java 中基本元素(基本數(shù)據(jù)類型 + 對應(yīng)的包裝類 + 常用引用類型如 String)的比較規(guī)則,可以總結(jié)為以下核心要點:

1. 基本數(shù)據(jù)類型:直接用==比較值

Java 的 8 種基本數(shù)據(jù)類型(byte、short、int、long、float、doublechar、boolean),只能用 == 比較值是否相等,不存在 equals() 方法。

int a = 10;
int b = 10;
System.out.println(a == b); // true,值相等
  • 注意:不同基本類型比較時會發(fā)生自動類型提升,比如 intlong 比較,int 會提升為 long 后再比。

2. 包裝類:分兩種情況

包裝類(IntegerLong、Boolean 等)是引用類型,但有常量池緩存機(jī)制,比較規(guī)則需區(qū)分場景:

比較方式適用場景規(guī)則說明
==緩存范圍內(nèi)的包裝類對象對于 Integer(-128 ~ 127)、Booleantrue/false)等,緩存池內(nèi)的對象用 == 會返回 true
==緩存范圍外的包裝類對象會創(chuàng)建新對象,== 比較的是地址,返回 false
equals()所有包裝類對象比較的是底層基本類型的值,推薦使用

示例:

Integer i1 = 127;
Integer i2 = 127;
System.out.println(i1 == i2); // true,在緩存范圍內(nèi)
System.out.println(i1.equals(i2)); // true

Integer i3 = 128;
Integer i4 = 128;
System.out.println(i3 == i4); // false,超出緩存范圍
System.out.println(i3.equals(i4)); // true

3. String 類型:核心看==和equals()的區(qū)別

String 是引用類型,且有字符串常量池,比較規(guī)則是 Java 面試高頻考點:

  • ==:比較的是對象的內(nèi)存地址
    • 直接賦值的字符串(如 String s = "abc")會存入常量池,相同內(nèi)容的字符串指向同一個地址。
    • new 創(chuàng)建的字符串(如 String s = new String("abc"))會在堆中創(chuàng)建新對象,地址不同。
  • equals():重寫過的方法,比較的是字符串的內(nèi)容,推薦使用。

示例:

String s1 = "hello";
String s2 = "hello";
String s3 = new String("hello");

System.out.println(s1 == s2); // true,常量池同一對象
System.out.println(s1 == s3); // false,地址不同
System.out.println(s1.equals(s3)); // true,內(nèi)容相同

基本元素比較的核心建議

  1. 基本數(shù)據(jù)類型:直接用 == 即可。
  2. 包裝類和 String:優(yōu)先用 equals() 比較內(nèi)容,避免因緩存/常量池機(jī)制導(dǎo)致的邏輯錯誤。
  3. 包裝類和基本類型混合比較:包裝類會自動拆箱為基本類型,用 == 直接比的值。
    Integer i = 10;
    int j = 10;
    System.out.println(i == j); // true,i 自動拆箱為 int
    

總結(jié)

  • 對象比較的最佳實踐總結(jié)
  • 不同場景下的選擇建議
  • 未來Java版本中可能的改進(jìn)

提示:文章寫完后,目錄可以自動生成,如何生成可參考右邊的幫助文檔

對象的比較

Java 中自定義對象的比較,核心圍繞 內(nèi)容相等性判斷大小關(guān)系排序 兩大需求,對應(yīng)四種實現(xiàn)方式,其中前三種是開發(fā)中最常用的:

1. 覆寫基類Object的equals()+hashCode()

核心用途

判斷兩個對象的內(nèi)容是否相等,是集合去重、條件判斷的基礎(chǔ)。

核心規(guī)則

  • equals():默認(rèn)比較對象地址(==),需重寫為基于核心業(yè)務(wù)屬性(如用戶 ID、訂單號)的比較邏輯。
  • hashCode():必須和 equals() 保持一致(規(guī)范要求:equals 相等的對象,hashCode 必須相同),否則 HashSet/HashMap 等哈希集合會失效。

實現(xiàn)要點

  1. 自反性:x.equals(x) 必須返回 true。
  2. 對稱性:x.equals(y)y.equals(x) 結(jié)果一致。
  3. 傳遞性:x.equals(y)y.equals(z),則 x.equals(z)
  4. 一致性:對象屬性不變時,多次調(diào)用 equals 結(jié)果不變。
  5. 非空性:x.equals(null) 必須返回 false。

示例

public class User {
    private Long id;
    private String name;

    @Override
    public boolean equals(Object o) {
        if (this == o) return true;
        if (o == null || getClass() != o.getClass()) return false;
        User user = (User) o;
        return Objects.equals(id, user.id) && Objects.equals(name, user.name);
    }

    @Override
    public int hashCode() {
        return Objects.hash(id, name);
    }
}

適用場景

  • 判斷兩個對象是否為“邏輯相等”(如判斷兩個用戶是否是同一個人)。
  • 作為 HashSet 元素、HashMapkey 時的必要操作。

2. 基于Comparable接口的比較

核心用途

定義對象的自然排序規(guī)則(默認(rèn)排序規(guī)則),讓對象“天生可比較”。

核心方法

實現(xiàn) int compareTo(T o) 方法:

  • 返回 正數(shù):當(dāng)前對象 > 目標(biāo)對象。
  • 返回 0:當(dāng)前對象 = 目標(biāo)對象。
  • 返回 負(fù)數(shù):當(dāng)前對象 < 目標(biāo)對象。

實現(xiàn)要點

  • 排序規(guī)則基于業(yè)務(wù)核心屬性(如按用戶 ID 升序、按價格降序)。
  • 需滿足比較器一致性x.compareTo(y) == 0 應(yīng)和 x.equals(y) 結(jié)果一致(非強(qiáng)制,但推薦遵守)。

示例

public class User implements Comparable<User> {
    private Long id;
    private String name;

    // 按 id 升序排序
    @Override
    public int compareTo(User o) {
        return this.id.compareTo(o.id);
    }
}

public class UserNameLengthComparator implements Comparator<User> {
@Overridepublic int compare (User u1, User u2) {
// 比較兩個 User 對象名字的長度
int len1 = u1.getName ().length ();
int len2 = u2.getName ().length ();
// 按名字長度升序排列,如果想降序就反過來減
return len1 - len2;
 }
}
//然后,當(dāng)你需要排序的時候,比如對一個 List<User>進(jìn)行排序,就可以把這個 Comparator 傳進(jìn)去:
List<User> userList = new ArrayList<>();
// 假設(shè)已經(jīng)往 userList 里加了一些 User 對象Collections.sort (userList, new UserNameLengthComparator ());
  • 好的,咱們再捋一遍。Collections.sort 這個方法,其實有兩種用法。第一種,只傳一個 List,這時候 List 里的每個對象,必須自己會 “比大小”,也就是實現(xiàn)了 Comparable 接口,重寫了 compareTo 方法。
  • sort 方法會自動調(diào)用對象的 compareTo 來排順序。第二種,傳一個 List 再加一個 Comparator 比較器,這時候?qū)ο笞约簳粫却笮o所謂,sort 方法會用你傳的比較器里的規(guī)則來排。簡單說就是,不傳比較器,就用對象自己的 compareTo;傳了比較器,就聽比較器的。 

適用場景

  • 對象有固定的默認(rèn)排序規(guī)則(如用戶默認(rèn)按 ID 排序、商品默認(rèn)按價格排序)。
  • 用于 Collections.sort(List)TreeSet/TreeMap 的默認(rèn)排序。

3. 基于Comparator比較器的比較

核心用途

定義對象的定制排序規(guī)則,靈活擴(kuò)展多種排序方式,不修改對象本身代碼。

核心方法

實現(xiàn) int compare(T o1, T o2) 方法,規(guī)則和 compareTo 一致。

實現(xiàn)形式

  • 匿名內(nèi)部類。
  • Lambda 表達(dá)式(JDK 8+ 推薦)。
  • 靜態(tài)工具類(如 Comparator.comparing)。

示例

// 方式1:Lambda 表達(dá)式,按姓名長度降序
Comparator<User> nameLengthComparator = (u1, u2) -> 
        Integer.compare(u2.getName().length(), u1.getName().length());

// 方式2:工具類,按姓名升序
Comparator<User> nameComparator = Comparator.comparing(User::getName);

適用場景

  • 對象需要多種排序規(guī)則(如用戶可按 ID、姓名、注冊時間排序)。
  • 無法修改對象源碼(如第三方類),但需要排序。
  • 用于 Collections.sort(List, Comparator)、TreeSet 構(gòu)造函數(shù)指定排序規(guī)則。

總結(jié)一下

比較方式核心作用靈活性適用場景
equals() + hashCode()判斷內(nèi)容相等集合去重、邏輯相等判斷
Comparable自然排序(默認(rèn)規(guī)則)對象有固定排序規(guī)則
Comparator定制排序(多規(guī)則)多種排序需求、第三方類排序
Objects.compare簡化比較 + 空指針防護(hù)JDK 8+ 簡潔排序代碼

選型口訣

  • 判相等:重寫 equals + hashCode。
  • 單排序:實現(xiàn) Comparable。
  • 多排序:用 Comparator 比較器。

可以理解Comparable 就是讓你的對象自己學(xué)會排序,比如 User 類實現(xiàn)了它,就相當(dāng)于 User 自己知道 “我要按 id 排”。而 Comparator 呢,就是一個外部的排序小工具,你想讓 User 按名字排,就做一個按名字比較的小工具傳給排序方法,不用改 User 本身。一個是自帶技能,一個是外部工具.

到此這篇關(guān)于JAVA中對象常見的幾種方法比較的文章就介紹到這了,更多相關(guān)JAVA對象方法比較內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • java數(shù)據(jù)庫開發(fā)之JDBC的完整封裝兼容多種數(shù)據(jù)庫

    java數(shù)據(jù)庫開發(fā)之JDBC的完整封裝兼容多種數(shù)據(jù)庫

    這篇文章主要介紹了java數(shù)據(jù)庫開發(fā)之JDBC的完整封裝兼容多種數(shù)據(jù)庫,需要的朋友可以參考下
    2020-02-02
  • Mybatis批量更新數(shù)據(jù)庫錯誤問題

    Mybatis批量更新數(shù)據(jù)庫錯誤問題

    這篇文章主要介紹了Mybatis批量更新數(shù)據(jù)庫錯誤問題,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
    2024-08-08
  • 部署springboot項目讀取外部配置文件實現(xiàn)過程

    部署springboot項目讀取外部配置文件實現(xiàn)過程

    本文介紹了Spring Boot項目如何讀取外部配置文件,以實現(xiàn)應(yīng)用與配置分離,主要通過將配置文件放在jar包的同級目錄中,或通過啟動命令指定配置文件路徑等方式實現(xiàn),這種方法可以避免每次部署時修改配置文件的麻煩
    2026-04-04
  • SpringBoot線程池和Java線程池的使用和實現(xiàn)原理解析

    SpringBoot線程池和Java線程池的使用和實現(xiàn)原理解析

    這篇文章主要介紹了SpringBoot線程池和Java線程池的用法和實現(xiàn)原理,本文通過實例代碼給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2023-04-04
  • Spring Boot統(tǒng)一異常處理最佳實踐(拓展篇)

    Spring Boot統(tǒng)一異常處理最佳實踐(拓展篇)

    這篇文章主要給大家介紹了關(guān)于Spring Boot統(tǒng)一異常處理最佳實踐(拓展篇)的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2019-02-02
  • Maven項目打包成可執(zhí)行Jar文件步驟解析

    Maven項目打包成可執(zhí)行Jar文件步驟解析

    這篇文章主要介紹了Maven項目如何打包成可執(zhí)行Jar文件,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下
    2020-05-05
  • SpringBoot使用Redis存儲Session實踐

    SpringBoot使用Redis存儲Session實踐

    本文介紹了Session的基本概念、工作流程和常見應(yīng)用場景,并詳細(xì)解釋了如何在JavaServlet中使用Session,接著,文章討論了Redis存儲Session的優(yōu)勢和配置方法,并提供了一個示例代碼,最后,總結(jié)了如何使用Redis存儲Session以及注意事項
    2026-02-02
  • Java泛型初學(xué)者之上、下界通配符的深入理解

    Java泛型初學(xué)者之上、下界通配符的深入理解

    這篇文章主要給大家介紹了關(guān)于Java泛型初學(xué)者之上、下界通配符的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者實用Java具有一定的參考學(xué)習(xí)價值,需要的朋友們下面來一起學(xué)習(xí)學(xué)習(xí)吧
    2019-12-12
  • SpringBoot+Vue解決跨域問題幾種處理方案介紹

    SpringBoot+Vue解決跨域問題幾種處理方案介紹

    同源策略是一種約定,它是瀏覽器最核心也最基本的安全功能,同源策略會阻止一個域的javascript腳本和另外一個域的內(nèi)容進(jìn)行交互,所以本文我家里聊聊SpringBoot結(jié)合Vue解決跨域問題幾種處理方案吧
    2025-07-07
  • 如何用Java將數(shù)據(jù)庫的數(shù)據(jù)生成pdf返回給前端用戶下載

    如何用Java將數(shù)據(jù)庫的數(shù)據(jù)生成pdf返回給前端用戶下載

    本文詳細(xì)介紹了使用SpringBoot、iText庫、MyBatis等技術(shù)從數(shù)據(jù)庫中選取數(shù)據(jù)并生成PDF文件的后端處理流程,文中通過代碼介紹的非常詳細(xì),需要的朋友可以參考下
    2024-09-09

最新評論

英吉沙县| 图们市| 陇西县| 茂名市| 昭通市| 荣昌县| 克拉玛依市| 兴文县| 顺义区| 阿荣旗| 天峨县| 绥芬河市| 灌南县| 高阳县| 泽库县| 孟州市| 海林市| 潼关县| 鲁山县| 延边| 尉氏县| 镶黄旗| 正阳县| 潼关县| 宝清县| 宜宾县| 景泰县| 大渡口区| 淮北市| 龙胜| 吴桥县| 平原县| 青神县| 乃东县| 金华市| 临清市| 嘉黎县| 宜兴市| 北票市| 永嘉县| 黄骅市|