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

Java重寫equals及hashcode方法流程解析

 更新時間:2020年04月17日 09:33:15   作者:經典雞翅  
這篇文章主要介紹了Java重寫equals及hashcode方法流程解析,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友可以參考下

初步探索

首先我們要了解equals方法是什么,hashcode方法是什么。

equals方法

equals 是java的obejct類的一個方法,equals的源碼如下:

public boolean equals(Object paramObject){
  return(this == paramObject);
}

由此我們可以看到equals是用來比較兩個對象的內存地址是否相等。

hashCode方法

hashCode方法是本地方法,用于計算出對象的一個散列值,用于判斷在集合中對象是否重復的關鍵。

一條定理

equals相同的對象,hashCode必然相同。

代碼示例

建立一個Student類。

public class Student {
  private String name;
  private int age;
  private String QQ;
  @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 &&
        Objects.equals(name, student.name) &&
        Objects.equals(QQ, student.QQ);
  }
}

在 student 類中,我們重寫了equals方法。

書寫一個測試類

public class Test {
  public static void main(String[] args) {
    Student student = new Student();
    Student student2 = new Student();
    System.out.println(student.equals(student2));  //true
    System.out.println(student.hashCode());      //356573597
    System.out.println(student2.hashCode());      //1735600054 
    HashMap<Student, String> map = new HashMap<>();
    map.put(student,"123");
    map.put(student2,"456");
    System.out.println(map.get(student));
    System.out.println(map.get(student2));
  }
}

輸出

true
356573597 student 的hashcode值
1735600054 student 2的hashcode值
123
456

此時,我們發(fā)現 equals 相等的對象,hashcode卻不相等,同時在map中用不同的對象進行了存儲,map計算出來的hash值不同,但equals卻相同。這時候懵了。到底兩個對象一樣不一樣呢。
所以我們在重寫equals的時候,必須重寫hashcode。

重新定義 student 類

public class Student {

  private String name;
  private int age;
  private String QQ;

  @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 &&
        Objects.equals(name, student.name) &&
        Objects.equals(QQ, student.QQ);
  }

  @Override
  public int hashCode() {

    return Objects.hash(name, age, QQ);
  }
}

再次測試

public class Test {
  public static void main(String[] args) {
    Student student = new Student();
    Student student2 = new Student();
    System.out.println(student.equals(student2));  //true
    System.out.println(student.hashCode());     // 29791  
    System.out.println(student2.hashCode());    // 29791  
    HashMap<Student, String> map = new HashMap<>();
    map.put(student,"123");
    map.put(student2,"456");
    System.out.println(map.get(student));  //456
    System.out.println(map.get(student2)); //456

  }
}

最后的輸出

true
29791 //相同的對象
29791
456 //說明以一個值key存儲,相同的值
456

幾條定理

1、兩個對象的equals相等,hashcode必然相等。

2、兩個對象不等,hashcode也可能相等。

3、hashcode相等,對象不一定相等。

4、hashcode不等,對象一定不等。

以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支持腳本之家。

相關文章

  • 淺談spring.factories文件的作用

    淺談spring.factories文件的作用

    本文主要介紹了淺談spring.factories文件的作用,spring.factories文件是Spring?Boot自動配置的核心文件之一,它的作用是將各種自動配置類與對應的配置類集中在一起,下面就來介紹一下如何使用,感興趣的可以了解一下
    2024-06-06
  • Spring?Boot如何配置yml配置文件定義集合、數組和Map

    Spring?Boot如何配置yml配置文件定義集合、數組和Map

    這篇文章主要介紹了Spring?Boot?優(yōu)雅配置yml配置文件定義集合、數組和Map,包括Spring?Boot?yml配置文件定義基本數據類型和引用數據類型的方式,需要的朋友可以參考下
    2023-10-10
  • Java網絡IO模型詳解(BIO、NIO、AIO)

    Java網絡IO模型詳解(BIO、NIO、AIO)

    Java支持BIO、NIO和AIO三種網絡IO模型,BIO是同步阻塞模型,適用于連接數較少的場景,NIO是同步非阻塞模型,適用于處理多個連接,支持自JDK1.4起,AIO是異步非阻塞模型,適用于異步操作多的場景,文中通過代碼介紹的非常詳細,需要的朋友可以參考下
    2024-10-10
  • Java中如何判斷是否為閏年詳細實例

    Java中如何判斷是否為閏年詳細實例

    所謂閏年就是指2月有29天的那一年,下面這篇文章主要給大家介紹了關于Java中如何判斷是否為閏年的相關資料,文中通過圖文以及實例代碼介紹的非常詳細,需要的朋友可以參考下
    2023-06-06
  • Java反射機制概念、原理與用法總結

    Java反射機制概念、原理與用法總結

    這篇文章主要介紹了Java反射機制概念、原理與用法,較為詳細的分析了java反射機制的概念、原理,并結合實例形式總結分析了java反射機制的具體使用方法與相關注意事項,需要的朋友可以參考下
    2017-11-11
  • 一文詳解如何通過Java實現SSL交互功能

    一文詳解如何通過Java實現SSL交互功能

    這篇文章主要為大家詳細介紹了如何通過Java實現SSL交互功能,文中的示例代碼講解詳細,對我們的學習或工作有一定的幫助,需要的可以參考一下
    2023-04-04
  • 使用maven依賴詳解

    使用maven依賴詳解

    本文主要介紹了Maven的基礎知識,包括Maven的簡介、倉庫類型、常用命令、場景舉例、指令總結、依賴范圍、settings.xml說明等,同時,還詳細講解了Maven依賴的傳遞、手動聲明optional、沖突解決等概念
    2025-02-02
  • java去除集合中重復元素示例分享 java去除重復

    java去除集合中重復元素示例分享 java去除重復

    這篇文章主要介紹了java去除集合中重復元素示例,大家參考使用吧
    2014-01-01
  • Spring?Cloud?Eureka:?指定Zone方式

    Spring?Cloud?Eureka:?指定Zone方式

    這篇文章主要介紹了Spring?Cloud?Eureka:?指定Zone方式,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2022-03-03
  • SpringBoot調用對方webService接口的幾種方法示例

    SpringBoot調用對方webService接口的幾種方法示例

    平常我們開發(fā)調用接口一般會用到幾種數據格式,比如有restful的,這個是目前最流行的,也是最簡單開發(fā)的,還有一種就是webservice數據格式,本文給大家介紹了幾種SpringBoot調用對方webService接口的方法,文中有相關的代碼示例供大家參考,需要的朋友可以參考下
    2023-11-11

最新評論

新宁县| 闻喜县| 桦南县| 宁安市| 金川县| 拉萨市| 京山县| 青冈县| 葫芦岛市| 新晃| 沙坪坝区| 孝义市| 汤原县| 古蔺县| 盐亭县| 山阳县| 防城港市| 舟山市| 凉山| 夏河县| 常宁市| 寻乌县| 石城县| 灵寿县| 易门县| 纳雍县| 隆化县| 茂名市| 台东县| 泰兴市| 安远县| 军事| 海口市| 桐乡市| 裕民县| 仁化县| 克东县| 伊通| 页游| 海原县| 漾濞|