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()

เลือกภาษา

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

สรุปโดย AI ของ durumis

  • `equals()` เป็นเมธอดที่ใช้เปรียบเทียบเนื้อหาของวัตถุว่าเหมือนกันหรือไม่ และ `hashCode()` เป็นเมธอดที่คืนค่าจำนวนเต็มที่ไม่ซ้ำกันของวัตถุ ทั้งสองอย่างนี้ใช้สำหรับเปรียบเทียบวัตถุ
  • ในโครงสร้างข้อมูลแฮช `hashCode()` ถูกใช้เพื่อกำหนดคีย์ ดังนั้นคุณจะต้องกำหนด `equals()` และ `hashCode()` ใหม่ด้วยกันเพื่อให้แน่ใจว่ารหัสแฮชเหมือนกัน
  • การใช้ `equals()` และ `hashCode()` ร่วมกันช่วยให้คุณจัดการวัตถุที่เหมือนกันในโครงสร้างข้อมูลแฮชได้อย่างมีประสิทธิภาพ

equals()

equals() เป็นการเปรียบเทียบเนื้อหาของวัตถุว่าเหมือนกันหรือไม่ มักเรียกว่าการเปรียบเทียบความเท่าเทียมกัน และถ้าไม่ได้กำหนด equals() ใหม่ จะมีการเปรียบเทียบเหมือนกันภายใน เหมือนกับ == ดังนั้น หากต้องการเปรียบเทียบวัตถุอย่างเท่าเทียมกันอย่างถูกต้อง คุณต้องใช้ equals()


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


hashCode()

hashCode() ตรวจสอบว่าวัตถุสองชิ้นเป็นวัตถุเดียวกันหรือไม่ ทำงานเหมือนกับการเปรียบเทียบเหมือนกัน == แต่เมธอด hashCode() จะส่งคืนค่าจำนวนเต็มเฉพาะของวัตถุในระหว่างรันไทม์ โดยทั่วไปจะส่งคืนที่อยู่หน่วยความจำของวัตถุที่เก็บไว้ใน Heap



เมธอดนี้มีคำสำคัญ 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);
    }


ลองใส่オブジェクトที่เหมือนกัน 2 อันในโครงสร้างข้อมูล HashSet ดังที่แสดงด้านบน เมื่อพิมพ์ขนาดของเซ็ตนี้ จะได้ 2 ทำไม มันจะเป็นแบบนั้น?


เนื่องจากโครงสร้างข้อมูลที่ใช้แฮชจะใช้ hashCode() ในการตัดสินใจ Key นั่นหมายความว่า ก่อนที่จะเปรียบเทียบว่าวัตถุนั้นเหมือนกันหรือไม่ จะเปรียบเทียบว่าแฮชโค้ดของวัตถุทั้งสองนั้นเหมือนกันหรือไม่ และจากนั้นจึงตัดสินใจว่าวัตถุทั้งสองนั้นเหมือนกันหรือไม่ ในกรณีนี้ หาก hashCode() ไม่ได้กำหนดใหม่ จะใช้ hashCode() ของวัตถุ ดังนั้นที่อยู่หน่วยความจำที่วัตถุแต่ละชิ้นถูกเก็บไว้จะถูกส่งคืน ดังนั้นจึงเป็นการดีกว่าที่จะกำหนด hashCode() ใหม่นอกเหนือจาก equals() สำหรับกรณีที่ใช้โครงสร้างข้อมูลแฮช


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() ร่วมกัน?

เนื่องจากโครงสร้างข้อมูลที่ใช้แฮชจะใช้ hashCode() ในการตัดสินใจ Key นั่นหมายความว่า ก่อนที่จะเปรียบเทียบว่าวัตถุนั้นเหมือนกันหรือไม่ จะเปรียบเทียบว่าแฮชโค้ดของวัตถุทั้งสองนั้นเหมือนกันหรือไม่ และจากนั้นจึงตัดสินใจว่าวัตถุทั้งสองนั้นเหมือนกันหรือไม่ ในกรณีนี้ หาก hashCode() ไม่ได้กำหนดใหม่ จะใช้ hashCode() ของวัตถุ ดังนั้นที่อยู่หน่วยความจำที่วัตถุแต่ละชิ้นถูกเก็บไว้จะถูกส่งคืน ดังนั้นจึงเป็นการดีกว่าที่จะกำหนด hashCode() ใหม่นอกเหนือจาก equals() สำหรับกรณีที่ใช้โครงสร้างข้อมูลแฮช

제이온
제이온
제이온
제이온
[Java] Synchronized Collection vs Concurrent Collection การวิเคราะห์เปรียบเทียบข้อดีข้อเสียของวิธีการต่างๆ ในการแก้ไขปัญหาการซิงโครไนซ์เมื่อใช้คอลเลกชันในสภาพแวดล้อมมัลติเธรดใน Java Vector, Hashtable, Collections.synchronizedXXX และคอลเลกชันแบบซิงโครไนซ์อื่น ๆ เช่น CopyOnWriteArrayList, ConcurrentHashMap, Con

25 เมษายน 2567

[Effective Java] รายการ 6. หลีกเลี่ยงการสร้างอ็อบเจ็กต์ที่ไม่จำเป็น คู่มือเกี่ยวกับวิธีลดการสร้างอ็อบเจ็กต์ที่ไม่จำเป็นใน Java อ็อบเจ็กต์แบบไม่เปลี่ยนแปลง เช่น String, Boolean ควรใช้ลิเทอรัล และควรแคชอินสแตนซ์ Pattern สำหรับนิพจน์ทั่วไป นอกจากนี้ การออโต้บอกซ์อาจทำให้ประสิทธิภาพลดลง ดังนั้นจึงควรใช้ประเภทพื้นฐาน รายละเอีย

28 เมษายน 2567

Java Collections Framework (JCF) คืออะไร - นิยามและลักษณะของ JCF (JAVA) Java Collections Framework (JCF) เป็นชุดคลาสใน Java ที่ให้วิธีการมาตรฐานในการจัดการข้อมูลจำนวนมากอย่างมีประสิทธิภาพ JCF นำโครงสร้างข้อมูลและอัลกอริธึมในการจัดเก็บข้อมูลมาใช้ในรูปแบบคลาสเพื่อเพิ่มความสามารถในการนำรหัสกลับมาใช้ใหม่ ปรับปรุงประสิทธิภาพ และคว

27 เมษายน 2567

[Javascript] โครงสร้างของวัตถุ (V8) วัตถุของ JavaScript ในเครื่องยนต์ V8 ถูกแปลงเป็น Fast mode ที่ปรับให้เหมาะสมเหมือนโครงสร้างข้อมูลตามสถานะและ Dictionary mode ที่ทำงานเป็นแฮชแมป Fast mode เร็วเนื่องจากคีย์และค่าอยู่ในรูปแบบคงที่เกือบทั้งหมด แต่เมื่อมีการเพิ่มคีย์ใหม่หรือดำเนินการลบองค์ประ
곽경직
곽경직
곽경직
곽경직
곽경직

18 มีนาคม 2567

[ไม่มีพื้นฐานทางวิศวกรรมคอมพิวเตอร์ การอยู่รอดในฐานะนักพัฒนา] 14. สรุปเนื้อหาการสัมภาษณ์ทางเทคนิคที่นักพัฒนาหน้าใหม่ถามบ่อย คู่มือเตรียมตัวสัมภาษณ์งานเทคนิคสำหรับนักพัฒนาหน้าใหม่ บทความนี้จะอธิบายแนวคิดที่มักปรากฏใน การสัมภาษณ์งาน เช่น พื้นที่หน่วยความจำหลัก โครงสร้างข้อมูล RDBMS และ NoSQL การเขียนโปรแกรมเชิงโครงสร้างและเชิงวัตถุ การโอเวอร์ไรด์และการโอเวอร์โหลด อัลกอริทึมการเป
투잡뛰는 개발 노동자
투잡뛰는 개발 노동자
투잡뛰는 개발 노동자
투잡뛰는 개발 노동자

3 เมษายน 2567

[Next.js] การฉีดรหัสรันไทม์ env เรียนรู้วิธีการตั้งค่าตัวแปรสภาพแวดล้อมหลังจากการสร้างใน Next.js คู่มือนี้จะแนะนำวิธีการติดตั้ง cross-env และแก้ไขสคริปต์เพื่อให้ผู้ใช้ Windows ทำตามได้ง่าย รวมถึงการใช้กับตัวแปรสภาพแวดล้อมที่หลากหลาย เช่น local, dev, qa, prod
Sunrabbit
Sunrabbit
Sunrabbit
Sunrabbit

20 มีนาคม 2567

[การสอบปฏิบัติช่างเทคนิคโลหะ] ครั้งที่ 33: คำอธิบาย โครงสร้างผลึกของวัสดุโลหะ กระบวนการเกิดนิวเคลียสเพอร์ไลต์ วิธีการวัดขนาดเม็ดคริสตัลเฟอร์ไรต์ องค์ประกอบหลัก 5 ประการของเหล็กและผลกระทบของแมงกานีส มาตรการป้องกันความเปราะบางจากการเผา คุณสมบัติของการชุบแข็ง สูตรคำนวณค่าปริมาณรังสีในการตรวจสอบด้วยรังสีเอกซ์
blog.naver.com/gksmftordldi
blog.naver.com/gksmftordldi
blog.naver.com/gksmftordldi
blog.naver.com/gksmftordldi
blog.naver.com/gksmftordldi

23 เมษายน 2567

[Concurrency] Atomic Operation: Memory Fence และ Memory Ordering บล็อกโพสต์นี้จะอธิบายวิธีการพิจารณาลำดับหน่วยความจำใน Atomic Operations และความสำคัญของตัวเลือก Ordering ตัวเลือก Ordering ที่หลากหลาย เช่น Relaxed, Acquire, Release, AcqRel และ SecCst จะถูกอธิบายพร้อมกับข้อดีข้อเสีย และข้อควรระวังในการใช้งานพร้อมกับตัวอย
곽경직
곽경직
곽경직
곽경직
곽경직

12 เมษายน 2567

การสร้างแบบจำลองข้อมูลเชิงตรรกะ การสร้างแบบจำลองข้อมูลเชิงตรรกะคือกระบวนการแปลงแบบจำลองข้อมูลเชิงแนวคิดให้สอดคล้องกับรูปแบบฐานข้อมูลเชิงสัมพันธ์ โดยใช้กฎการแมป ซึ่งเกี่ยวข้องกับ การจัดการความสัมพันธ์ 1:1, 1:N, N:M และการทำให้เป็นปกติเพื่อให้ได้มาซึ่งความสมบูรณ์ของข้อมูล 1NF, 2NF, 3NF ผ่
제이의 블로그
제이의 블로그
제이의 블로그
제이의 블로그
제이의 블로그

9 เมษายน 2567