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 }

 

posted @ 2016-09-23 20:19  卡拉瓦  阅读(287)  评论(0编辑  收藏  举报