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 }

原文地址:https://www.cnblogs.com/huxiaobai/p/11494186.html

时间: 2024-08-02 09:43:15

HashSet -无序,不重复集合的相关文章

java:Set对象TreeSet有序子类,HashSet无序子类,重复对象二

TreeSet有序子类; HashSet无序子类 重复重复元素,Object对象是通过equals和hashCode来进行过滤的. 如果将上一篇提到中的例子中的TreeSet,换成HashSet,那么代码就不会过滤从的对象 HashSet无序子类,如何过滤重复的对象呢?(单个元素是可以过滤,但相同的对象不会) Person: public class Person implements Comparable<Person> { private String name; private int

java: Set类及子类:TreeSet有序子类,HashSet无序子类

Set类及子类: TreeSet有序子类: HashSet无序(散列)子类 HashSet子类的内容是没有顺序的,单个元素也不会重复的(对象除外). Set<String> allSet = new HashSet<String>(); allSet.add("a"); //重复数据 allSet.add("b"); allSet.add("b"); allSet.add("c"); allSet.ad

Java记录 -56- 详解HashSet不含重复元素的实现

详解HashSet不含重复元素的实现 HashSet的add方法: public boolean add(E e) 如果此 set 中尚未包含指定元素,则添加指定元素.更确切地讲,如果此 set 没有包含满足 (e==null ? e2==null : e.equals(e2)) 的元素 e2,则向此 set 添加指定的元素 e.如果此 set 已包含该元素,则该调用不更改 set 并返回 false. Object的equals方法: public boolean equals(Object 

在唯一密钥属性“fileExtension”设置为“.log”时,无法添加类型为“mimeMap”的重复集合项

如果IIS中已经有设置.xaml和 .xap这两个扩展名,那么IIS就会提示:在唯一密钥属性“fileExtension”设置为“.xaml”(或者.xap)时,无法添加类型为“mimeMap”的重复集合项. <staticContent> <mimeMap fileExtension=".json" mimeType="application/x-javascript" /> </staticContent> 具体的提示信息是根

问题.NET--win7 IIS唯一密钥属性“VALUE”设置为“DEFAULT.ASPX”时,无法添加类型为“add”的重复集合

问题现象:.NET--win7 IIS唯一密钥属性“VALUE”设置为“DEFAULT.ASPX”时,无法添加类型为“add”的重复集合 问题处理: 内容摘要: HTTP 错误 500.19 - Internal Server Error 无法访问请求的页面,因为该页的相关配置数据无效. 错误摘要 HTTP 错误 500.19 - Internal Server Error 无法访问请求的页面,因为该页的相关配置数据无效. 详细错误信息模块 DefaultDocumentModule 通知 Ex

IIS错误:在唯一密钥属性“fileExtension”设置为“.json”时,无法添加类型为“mimeMap”的重复集合项

在用visual studio 打开一个asp.net mvc 项目时,ctrl+f5运行,发现页面无法加载图片.js.json文件. 按F12查看错误,发现500错误.打开报错的js文件,提示: IIS错误:在唯一密钥属性"fileExtension"设置为".mp4"时,无法添加类型为"mimeMap"的重复集合项 参考园内博客的解决方案:在web.config文件中添加: <staticContent> <remove f

java基础33 Set集合下的HashSet集合和TreeSet集合

集合的体系: ---------| collection  单例集合的根接口--------------| List  如果实现了list接口的集合类,具备的特点:有序,可重复       注:集合中的有序不是指自然顺序,而是指添加进去的顺序与出来的顺序是一致的------------------| ArrayList  ArrayList底层维护了一个object数组的实现的.(线程不安全),特点:查询速度快,增删速度慢.(有序,可重复)------------------| LinkedLi

HashSet实现不重复储值原理-附源码解析

在HashSet中,基本的操作都是由HashMap底层实现的,因为HashSet底层是用HashMap存储数据.当向HashSet中添加元素的时候,首先计算元素的hashcode值,然后用这个(元素的hashcode)%(HashMap集合的大小)+1计算出这个元素的存储位置,如果这个位置位空,就将元素添加进去:如果不为空,则用 equals 方法比较元素是否相等,相等就不添加,否则找一个空位添加. 附中文注释源码: 1 public class HashSet<E> 2 extends Ab

LeetCode 705. Design HashSet (设计哈希集合)

题目标签:HashMap 题目让我们设计一个 hashset,有add,contains,remove 功能. 建立一个boolean array,index 是数字的值,具体看code. Java Solution: Runtime: 58 ms, faster than 90.21% Memory Usage: 56.3 MB, less than 68.53% 完成日期:03/18/2019 关键点:boolean array class MyHashSet { boolean [] se