最新国产好看的视频,伊人天堂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ā)現(xiàn) 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配置文件定義集合、數(shù)組和Map

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

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

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

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

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

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

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

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

    一文詳解如何通過Java實現(xiàn)SSL交互功能

    這篇文章主要為大家詳細介紹了如何通過Java實現(xiàn)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ā)調用接口一般會用到幾種數(shù)據格式,比如有restful的,這個是目前最流行的,也是最簡單開發(fā)的,還有一種就是webservice數(shù)據格式,本文給大家介紹了幾種SpringBoot調用對方webService接口的方法,文中有相關的代碼示例供大家參考,需要的朋友可以參考下
    2023-11-11

最新評論

宜兴市| 宜丰县| 民县| 江孜县| 孟州市| 江山市| 阳泉市| 阿拉尔市| 托克逊县| 彭泽县| 区。| 耒阳市| 宁晋县| 潼南县| 宁安市| 时尚| 巴彦县| 衡阳县| 古浪县| 界首市| 蕉岭县| 阿勒泰市| 新密市| 荥经县| 兴安盟| 循化| 鄯善县| 二连浩特市| 方城县| 澄城县| 林西县| 海伦市| 漳浦县| 乐安县| 当阳市| 宾川县| 年辖:市辖区| 桓台县| 吉林市| 长治市| 措勤县|