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 }