首页 > 代码库 > java 17- 3 hashCode()方法

java 17- 3 hashCode()方法

  HashSet:存储字符串并遍历
    问题:为什么存储字符串的时候,字符串内容相同的只存储了一个呢?
       通过查看add方法的源码,我们知道这个方法底层依赖 两个方法:hashCode()和equals()。
    步骤:
      首先比较哈希值
        如果相同,继续走,比较地址值或者走equals()
        如果不同,就直接添加到集合中
      按照方法的步骤来说:
        先看hashCode()值是否相同
          相同:继续走equals()方法
            返回true: 说明元素重复,就不添加
            返回false:说明元素不重复,就添加到集合
          不同:就直接把元素添加到集合
            如果类没有重写这两个方法,默认使用的Object()。一般来说不同相同。
            而String类重写了hashCode()和equals()方法,所以,它就可以把内容相同的字符串去掉。只留下一个。

 1 import java.util.HashSet; 2 public class HashSetDemo { 3 public static void main(String[] args) { 4 // 创建集合对象 5 HashSet<String> hs = new HashSet<String>(); 6  7 // 创建并添加元素 8 hs.add("hello"); 9 hs.add("world");10 hs.add("java");11 hs.add("world");12 13 // 遍历集合14 for (String s : hs) {15 System.out.println(s);16 }17 }18 }19 20  

 


   需求:存储自定义对象,并保证元素的唯一性
   要求:如果两个对象的成员变量值都相同,则为同一个元素。

   目前是不符合我的要求的:因为我们知道HashSet底层依赖的是hashCode()和equals()方法。
   而这两个方法我们在学生类中没有重写,所以,默认使用的是Object类。
   这个时候,他们的哈希值是不会一样的,根本就不会继续判断,执行了添加操作。

 1 import java.util.HashSet; 2 public class HashSetDemo2 { 3 public static void main(String[] args) { 4 // 创建集合对象 5 HashSet<Student> hs = new HashSet<Student>(); 6  7 // 创建学生对象 8 Student s1 = new Student("林青霞", 27); 9 Student s2 = new Student("柳岩", 22);10 Student s3 = new Student("王祖贤", 30);11 Student s4 = new Student("林青霞", 27);12 Student s5 = new Student("林青霞", 20);13 Student s6 = new Student("范冰冰", 22);14 15 // 添加元素16 hs.add(s1);17 hs.add(s2);18 hs.add(s3);19 hs.add(s4);20 hs.add(s5);21 hs.add(s6);22 23 // 遍历集合24 for (Student s : hs) {25 System.out.println(s.getName() + "---" + s.getAge());26 }27 }28 }

 

java 17- 3 hashCode()方法