diff --git a/s-day03/src/com/inmind/set02/HashDemo07.java b/s-day03/src/com/inmind/set02/HashDemo07.java new file mode 100644 index 0000000..90819bc --- /dev/null +++ b/s-day03/src/com/inmind/set02/HashDemo07.java @@ -0,0 +1,48 @@ +package com.inmind.set02; + +import java.util.HashSet; + +/* + 1.什么是哈希值??? + 哈希值就是对象的特征码,使用十进制int来表示的,int是取值范围的,有限的,对象是无限。(不同的对象的哈希值可能相同的) + + 2.如何获取一个对象的哈希值??? + int hashCode() 返回对象的哈希码值。 + Object的hashCode源码: + public native int hashCode();//通过真正的地址值,使用哈希算法,返回的一个int值 + + 3.我们发现每个对象的哈希值都是默认通过地址来获取,对于程序员来说没有意义,我们在实际开发中 + 希望拥有相同的内容的对象是同一个对象(哈希值要一样),所以我们子类重写hashCode方法,在判断 + 时使用到的哈希值要保持一致。 + + 如何重写??学习一个最终类 String,得出String的哈希值跟它的内容有关,那么自定义的类重写 + hashCode方法,那么也跟自己的属性有关,alt+insert + + + */ +public class HashDemo07 { + public static void main(String[] args) { + Student s1 = new Student("刘备", 30); + Student s2 = new Student("刘备", 30); + System.out.println(s1); + System.out.println(s1.hashCode()); + System.out.println(s2.hashCode()); + + + String s3 = "通话"; + String s4 = "重地"; + String s5 = "abc"; + String s6 = new String("abc"); + System.out.println(s3.hashCode()); + System.out.println(s4.hashCode()); + System.out.println(s5.hashCode()); + System.out.println(s6.hashCode()); + + HashSet sets = new HashSet<>(); + sets.add(s6); + sets.add(s5); + sets.add(s4); + sets.add(s3); + System.out.println(sets); + } +} diff --git a/s-day03/src/com/inmind/set02/Student.java b/s-day03/src/com/inmind/set02/Student.java new file mode 100644 index 0000000..a67dc29 --- /dev/null +++ b/s-day03/src/com/inmind/set02/Student.java @@ -0,0 +1,28 @@ +package com.inmind.set02; + +import java.util.Objects; + +public class Student { + String name; + int age; + + public Student(String name, int age) { + this.name = name; + this.age = age; + } + + @Override + public boolean equals(Object o) { + if (o == null || getClass() != o.getClass()) return false; + + Student student = (Student) o; + return age == student.age && Objects.equals(name, student.name); + } + + @Override + public int hashCode() { + int result = Objects.hashCode(name); + result = 31 * result + age; + return result; + } +}