Try using it in your preferred language.

English

  • English
  • 汉语
  • Español
  • Bahasa Indonesia
  • Português
  • Русский
  • 日本語
  • 한국어
  • Deutsch
  • Français
  • Italiano
  • Türkçe
  • Tiếng Việt
  • ไทย
  • Polski
  • Nederlands
  • हिन्दी
  • Magyar
translation

这是AI翻译的帖子。

제이온

equals() vs hashCode()

  • 写作语言: 韓国語
  • 基准国家: 所有国家 country-flag

选择语言

  • 汉语
  • English
  • Español
  • Bahasa Indonesia
  • Português
  • Русский
  • 日本語
  • 한국어
  • Deutsch
  • Français
  • Italiano
  • Türkçe
  • Tiếng Việt
  • ไทย
  • Polski
  • Nederlands
  • हिन्दी
  • Magyar

durumis AI 总结的文章

  • equals() 是用于比较对象內容是否相同的方法,hashCode() 是用于返回对象唯一整数值的方法,两者都 用于比较对象。
  • 在哈希数据结构中,使用 hashCode() 来确定键,因此,需要同时重写 equals() 和 hashCode() 以确保相同的 哈希代码。
  • 同时使用 equals() 和 hashCode() 可以有效地管理哈希数据结构中的相同对象。

equals()

equals() 用于比较对象的內容是否相同。通常称为等效比较,如果未重写 equals(),则在内部与 == 相同,因此它是相等比较。因此,如果您想正确地比较对象是否相等,则必须使用 equals()。


public boolean equals(Object obj) { 
    return (this == obj); 


hashCode()

hashCode() 用于检查两个对象是否为同一对象。它具有与 == 相同的等效比较功能,但 hashCode() 方法返回一个整数,表示运行时对象的唯一值。通常,它返回堆中存储的对象的内存地址。



该方法带有 native 关键字,这是在 Java 中使用除 Java 之外的语言开发的语言时使用的关键字。


什么是哈希?

哈希是指使用哈希函数将可变大小的输入值转换为固定大小的输出值的過程。通过哈希获得的值称为哈希码。


equals() 和 hashCode()

由于相同的对象必须具有相同的内存地址,因此相同的对象必须具有相同的哈希码。因此,除了 equals() 之外,最好重写 hashCode() 来确保相同的哈希码。


哈希数据结构

public class Main {

    public static void main(String[] args) throws IOException {
        Set people = new HashSet<>();

        people.add(new Person("제이온", 23));
        people.add(new Person("제이온", 23));
        System.out.println(people.size()); // 2
    }
}

class Person {

    private final String name;

    private final int age;

    public Person(String name, int age) {
        this.name = name;
        this.age = age;
    }

    @Override
    public boolean equals(Object o) {

        if (this == o) return true;
        if (o == null || getClass() != o.getClass()) return false;
        Person person = (Person) o;
        return age == person.age && Objects.equals(name, person.name);
    }


像这样,尝试将两个相等的对象插入 HashSet 数据结构中。如果输出该 Set 的大小,则将显示 2。为什么呢?


这是因为使用哈希的数据结构在确定 Key 时使用 hashCode()。也就是说,在比较对象是否相等之前,它会比较两个对象的哈希码是否相等,然后确定两个对象是否相等。此时,如果 hashCode() 未重写,则将使用 Object 的 hashCode(),因此将返回每个对象存储的内存地址。因此,最好在使用哈希数据结构时除了 equals() 之外还重写 hashCode()。


public static void main(String[] args) throws IOException {
        Set people = new HashSet<>();

        people.add(new Person("제이온", 23));
        people.add(new Person("제이온", 23));
        System.out.println(people.size()); // 1
    }
}

class Person {

    private final String name;

    private final int age;

    public Person(String name, int age) {
        this.name = name;
        this.age = age;
    }

    @Override
    public boolean equals(Object o) {

        if (this == o) return true;
        if (o == null || getClass() != o.getClass()) return false;
        Person person = (Person) o;
        return age == person.age && Objects.equals(name, person.name);
    }

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


来源


预期面试问题和答案

为什么 equals() 和 hashCode() 要一起使用?

这是因为使用哈希的数据结构在确定 Key 时使用 hashCode()。也就是说,在比较对象是否相等之前,它会比较两个对象的哈希码是否相等,然后确定两个对象是否相等。此时,如果 hashCode() 未重写,则将使用 Object 的 hashCode(),因此将返回每个对象存储的内存地址。因此,最好在使用哈希数据结构时除了 equals() 之外还重写 hashCode()。

제이온
제이온
제이온
제이온
[Effective Java] 項目 6. 避免不必要的物件建立 這是一份關於在 Java 中減少不必要物件建立的指南。對於 String、Boolean 等不變物件,最好使用字面值;對於正規表示式,最好快取 Pattern 物件。此外,自動裝箱會導致效能下降,因此最好使用基本類型。有關更多資訊,請參閱「Effective Java」。

2024年4月28日

[Java] Synchronized Collection vs Concurrent Collection 在 Java 中,当在多线程环境中使用集合时,本文比较分析了各种解决同步问题的方法及其优缺点。 分析了 Vector、Hashtable、Collections.synchronizedXXX 等同步集合和 CopyOnWriteArrayList、 ConcurrentHashMap、ConcurrentLinkedQueue 等并发集合的特点和性能差异,以及各自的最佳使用场景。

2024年4月25日

Java Collections Framework(JCF)是什麼? - JCF 的定義和特點 (JAVA) Java Collections Framework (JCF) 是一組提供標準化方式來有效處理大量數據的 Java 類。JCF 通過將數據存儲結構和算法實 現為類來提高代碼可重用性、性能提升和 API 相互操作性。

2024年4月27日

[Javascript] 物件的結構 (V8) JavaScript 的 Object 在 V8 引擎中根據狀態可以被優化為類似結構體的 Fast 模式或以雜湊表運作的 Dictionary 模式。Fast 模式是針對幾乎固定形式的鍵和值進行優化,速度很快,但當新增新鍵或刪除元素等操作時, 會轉換為 Dictionary 模式,速度會變慢。
곽경직
곽경직
곽경직
곽경직
곽경직

2024年3月18日

邏輯數據模型 邏輯數據模型是將概念數據模型轉換為關係數據庫範式的過程,根據映射規則,將 1:1、1:N、N:M 關係 轉換為關係數據庫中的表格,並通過正規化來確保數據完整性。通過 1NF、2NF、3NF 的正規化過程,對表格進行 優化,消除部分依賴和傳遞依賴。
제이의 블로그
제이의 블로그
제이의 블로그
제이의 블로그
제이의 블로그

2024年4月9日

什麼是數據標註?類型、優點、缺點 數據標註是幫助電腦理解數據的必要過程,就像在狗和貓的照片上分別貼上“狗”和“貓”的標籤一樣, 通過在數據上添加標籤,使電腦學習成為可能。有矩形、點、多邊形等多種標註方式, 通過這些方式,可以在計算機視覺、語音識別、自然語言處理等多個領域提高人工智慧模型的性能。
세상 모든 정보
세상 모든 정보
세상 모든 정보
세상 모든 정보

2024年3月29日

概念性數據模型 概念性數據模型是將實體分離並使用 ERD 表示實體間關係的過程。實體是獨立的資訊單位,屬性是 實體擁有的數據。識別碼用於唯一識別實體,關係表示實體間的交互作用。基數性表示實體間的數量關係,可選性表示數據的必需性。
제이의 블로그
제이의 블로그
제이의 블로그
제이의 블로그

2024年4月8日

[非计算机专业,如何成为一名开发者] 14. 新手开发者常问的技术面试内容总结 本指南旨在为新手开发者提供技术面试准备指导。涵盖了面试中常见的概念,例如主内存区域、数据结构、关系型数据库 (RDBMS) 和 NoSQL、过程式编程和面向对象编程、重写和重载、页面替换算法、进程和线程、OSI 七层模型、TCP 和 UDP 等。
투잡뛰는 개발 노동자
투잡뛰는 개발 노동자
투잡뛰는 개발 노동자
투잡뛰는 개발 노동자

2024年4月3日

物理資料模型 物理資料模型是將關係型資料庫的表格設計成實際可使用的過程,透過儲存空間效率、資料分割、索引設計等,以達成效能最佳化為目標。透過慢查詢分析、索引運用、快取應用等,可以解決效能問題,必要時也可以使用反正規化技術。
제이의 블로그
제이의 블로그
제이의 블로그
제이의 블로그
제이의 블로그

2024年4月9日