HashSet -无序,不重复集合

 1 package cn.learn.collection.Set;
 2 
 3 import java.util.Objects;
 4 
 5 public class IsPerson {
 6     private int age;
 7     private String name;
 8 
 9     //ide自动生成
10     @Override
11     public boolean equals(Object o) {
12         if (this == o) return true;
13         if (o == null || getClass() != o.getClass()) return false;
14         IsPerson isPerson = (IsPerson) o;
15         return age == isPerson.age &&
16                 Objects.equals(name, isPerson.name);
17     }
18 
19     @Override
20     public int hashCode() {
21         return Objects.hash(age, name);
22     }
23 
24     @Override
25     public String toString() {
26         return "IsPerson{" +
27                 "age=" + age +
28                 ", name='" + name + '\'' +
29                 '}';
30     }
31 
32     public IsPerson() {
33     }
34 
35     public IsPerson(int age, String name) {
36         this.age = age;
37         this.name = name;
38     }
39 
40     public int getAge() {
41         return age;
42     }
43 
44     public void setAge(int age) {
45         this.age = age;
46     }
47 
48     public String getName() {
49         return name;
50     }
51 
52     public void setName(String name) {
53         this.name = name;
54     }
55 }
 1 package cn.learn.collection.Set;
 2 
 3 import java.util.HashSet;
 4 
 5 /*
 6     HashSet集合存储数据的结构(哈希表)  -泛型类
 7     jdk1.8版本之前:哈希表=数组+链表
 8     jdk1.8版本之后:
 9         哈希表=数组+链表;(链表超过八位转红黑树,提高查询效率)
10         哈希表=数组+红黑树(提高查询速度)
11     哈希表:速度快
12 
13     Set集合不允许重复元素的原理
14     Set集合在调用add方法的时候,add会调用hashCode是否哈希冲突
15     冲突再调用equals方法,判断元素重复,重复就不存储到集合中
16     注:前提必须重写HashCode方法(比较,不一致添加到集合)和(相同哈希值)equals
17 
18     1,为什么哈希码相同了还有可能是不同对象?2,为什么经过比较哈希码还需要借助equals方法判断?
19 
20     答:首先:按照Object类的hashCode方法,是不可能返回两个相同的哈希码的。(哈希码唯一标志了对象)
21      然后:Object类的hashCode方法返回的哈希码具有唯一性(地址唯一性),但是这样不能让程序的运行逻辑
22     符合现实生活。(这个逻辑就是:属性相同的对象被看作同一个对象。)为了让程序的运行逻辑符合现实生活,
23     Object的子类重写了hashCode的方法(基本数据类型的实现类都已经重写了两个方法,自定义的类要软件工程
24      师自己重写。)
25 
26     那么:重写的宗旨是什么?重写就是为了实现这样的目的:属性相同的不同对象在调用其hashCode方法后,返回的
27     是同样的哈希码。但是我们在重写的时候,发现几乎所有的写法都无法避免一个bug:有一些属性不同的对象(当然
28     是不同的对象),会返回相同的哈希码。(即 重码)
29 
30     最后:为了解决这个问题:在哈希码相同的时候,再用equals方法比较两个对象的对应属性
31     是否相同,这样,确保了万无一失。这样:上面两个问题得到解决。
32 
33 
34  */
35 public class HashSet_Set {
36     public static void main(String[] args) {
37         HashSet<String> set=new HashSet();
38         set.add("sad");
39         set.add("sad");
40         System.out.println(set); //
41 
42 
43         //重写HashCode与equals方法,以用来存储自定义元素
44         HashSet<IsPerson> set1=new HashSet<>();
45         IsPerson p1=new IsPerson(12,"sad");
46         IsPerson p2=new IsPerson(10,"ddd");
47         IsPerson p3=new IsPerson(10,"ddd");
48         set1.add(p1);
49         set1.add(p2);
50         set1.add(p3);
51         /*
52         System.out.println(set1);
53         //[IsPerson{age=10, name='ddd'}, IsPerson{age=12, name='sad'}, IsPerson{age=10, name='ddd'}]
54          */
55         //由上可知,需要在IsPerson重写Hashcode和equals方法,ide自动生成
56         System.out.println(set1);  //[IsPerson{age=12, name='sad'}, IsPerson{age=10, name='ddd'}]
57 
58 
59 
60     }
61 }

 

posted @ 2019-09-09 20:53  学之初  阅读(792)  评论(0编辑  收藏  举报