文章目录

  • 前言
  • 一、HashSet 集合的存储
  • 二、将Object类存入HashSet
  • 总结

前言

HashSet 是 Set 接口的一个实现类,它所存储的元素是不可重复的,并且元素都是无序的。这个必须要明白。重点、重点、重点。。。存储元素的两个特点:唯一、无序。


一、HashSet 集合的存储

1.案例描述

练习目标

                       了解 HashSet 集合的存储特点

需求分析

                        为了让初学者熟悉 HashSet 集合的用法,本案例将针对 HashSet 集合中元素不可重复的特点,对 HashSet 集合的存储和遍历过程进行演示。

设计思路(实现原理)

                        1) 编写一个类 Example09,在该类中定义一个 HashSet 集合 hs

2) 向集合 hs 中添加 6 个元素,其中有一些重复的元素

3) 用 size()方法获取添加完元素后集合中元素的个数

4) 用 Iterator 迭代器遍历集合的每一个元素

5) 观察在输出结果中,是否存在重复的元素

2.案例实现

Example09类代码:

package JHClass;import java.util.*;
public class Example09 {public static void main(String[] args) {// 创建HashSet集合HashSet hs = new HashSet();//向HashSet集合中添加元素,其中包括重复元素hs.add("abc2");        hs.add("abc2");hs.add("abc1");hs.add("abc4");hs.add("abc4");hs.add("abc3");// 输出集合中元素的个数System.out.println("添加后集合中元素个数:"+hs.size());// 输出集合中每一个元素Iterator it = hs.iterator();System.out.println("添加后集合中包含以下元素:");while (it.hasNext()) {System.out.println(it.next());}}
}

运行结果: 

                        因为前言说过HashSet 集合存储的元素是不可重复的,并且元素都是无序的。所以输出结果如下:

​​​​​​​        

注意:HashSet 集合在添加元素时,会判断要添加的元素现在集合中有没有,有的话就不会添加进去。集合中没有要添加的元素才会添加到HashSet 集合。所以我们添加了6个元素,而添加后集合中只有4个不同的元素。

3.案例总结

                1、HashSet 是 Set 接口的一个实现类,它所存储的元素是不可重复的,并且元素都是无序的。当向 HashSet 集合中添加一个对象时,首先会调用该对象的 hashCode()方法来确定元素的存储位置,然后再调 用对象的 equals()方法来确保该位置没有重复元素。

2、在本案例中,首先通过 add()方法向 HashSet 集合依次添加了六个字符串,然后通过 Iterator 迭代器 遍历所有的元素并输出打印。从打印结果可以看出取出元素的顺序与添加元素的顺序并不一致,并且重复 存入的字符串对象"abc2"和"abc4"被去除了,只添加了一次。

二、将Object类存入HashSet

1.案例描述

练习目标

                       掌握如何将对象存入 HashSet 集合并且去除重复对象

需求分析

                        HashSet 集合之所以能确保不出现重复的元素,是因为它在添加对象时,会先调用该对象的 hashCode()方法来确定元素的存储位置,再调用对象的 equals()方法来确保该位置没有重复元素。 为了将 Object 类存入 HashSet 集合,本案例将针对如何重写 Object 类中的hashCode()和 equals() 方法去除重复的 Object 对象进行演示。

设计思路(实现原理)

                        1) 设计一个 Person 类,在该类中定义两个变量 name 和 age

2) 在 Person 类中重写 hashCode()和 equals()方法

3) 编写类 Example10,在该类中定义一个 HashSet 集合

4) 将 Person 对象存入 HashSet 集合中,其中含有重复的 Person 对象

5) 遍历 HashSet 集合中的元素,观察结果是否含有重复的对象

2.案例实现

设计 Person 类,其代码如下:

package JHClass;class Person {private String name;private int age;public Person(String name, int age) {this.name = name;this.age = age;}// 重写hashCode方法,返回name属性的哈希值public int hashCode() {return name.hashCode() + age * 2;}// 重写equals方法public boolean equals(Object obj) {if (this == obj)return true;if (obj instanceof Person) {Person p = (Person) obj;return this.name.equals(p.name) && this.age == p.age;}return false;}// 重写toString()方法public String toString() {return "Person  " + name +"  "+ age;}
}

注意:equals方法选的是HashSet 集合中该位置没有对象,或者有对象但名字和年龄与要存的对象不同,才会返回false,把该对象添加到集合中。如果该哈希值位置有对象,并且和要存入对象的名字和年龄都相同,则会舍弃该对象,就不会存储到HashSet 集合中。

Example10类代码:

package JHClass;import java.util.*;
public class Example10 {
public static void main(String[] args) {// 创建HashSet对象HashSet hs = new HashSet();// 将Person对象存入集合hs.add(new Person("lisa", 21));hs.add(new Person("lisi", 32));hs.add(new Person("lisi", 32));hs.add(new Person("leilei", 31));hs.add(new Person("lusi", 25));hs.add(new Person("lusi", 25));// 遍历集合中的元素Iterator it = hs.iterator();while (it.hasNext()) {Person p = (Person) it.next();System.out.println(p);}
}
}

运行结果 

                        

3.案例总结

                在本案例中,当 HashSet 集合的存入元素时,首先调用当前存入对象的 hashCode()方法获得 name 属性 的哈希值,然后根据对象的哈希值计算出一个存储位置。如果该位置上没有元素,则直接将元素存入,如 果该位置上有元素存在,则会调用 equals()方法让当前存入的元素依次和该位置上的元素进行比较,如果 返回的结果为 false 就将该元素存入集合,返回的结果为 true 则说明有重复元素,就将该元素舍弃。

执行过程图


总结

HashSet 集合主要还是要掌握前言说的HashSet 集合中存储的元素不可重复,无序这两个特点。将Object类存入HashSet计较难理解一些。

JAVA知识点 HashSet 集合的用法[案例+代码+总结]相关推荐

  1. Java知识点04——集合(Set、List、Queue、Map、Collection和Iterator、Collections工具类)

    Java知识点04--集合(Set.List.Queue.Map.Collection.Iterator.Collections工具类) 一.集合 1.1 集合概述 二.Collection 2.1 ...

  2. Java中Set集合的用法

    java.util.Set 接口 extends Collection接口 1.Set接口的特点: (1)不允许存储重复的元素. (2)没有索引,没有带索引的方法,也不能使用普通的for循环遍历. 2 ...

  3. [Java基础]HashSet集合概述和特点

    HashSet集合概述和特点: 练习代码如下: package HashSetPackage;import java.util.HashSet;public class HashSetDemo {pu ...

  4. Java 在HashSet集合中添加三个Person对象,把姓名相同的人当做同一个人,禁止重复添加。Person类中定义name和age属性。

    import java.util.HashSet;public class Person {private String name;private int age;public Person(Stri ...

  5. choose when 改在java中_Mybatis choose when用法实例代码

    mybatis choose when的用法实现代码如下所示: mapper.xml: select a.city_id as CITYID, a.level1_maintain_unit_id as ...

  6. java 同步 set_Java Collections synchronizedSet()用法及代码示例

    java.util.Collections类的synchronizedSet()方法用于返回由指定集合支持的同步(线程安全)集合.为了保证串行访问,至关重要的是,对后备集的所有访问都必须通过返回的集来 ...

  7. java set clear_Java Set clear()用法及代码示例

    Java.util.Set.clear()方法用于从Set中删除所有元素.使用clear()方法仅清除集合中的所有元素,而不删除集合.换句话说,可以说clear()方法仅用于清空现有Set. 用法: ...

  8. java is start_PHP IntlChar::isJavaIDStart()用法及代码示例

    IntlChar::isJavaIDStart()函数是PHP中的一个内置函数,用于检查输入字符代码点是否允许,因为第一个字符是Java标识符.对于具有常规类别"Sc"(货币符号) ...

  9. java的entryset_Java Map entrySet()用法及代码示例

    Java中的java.util.Map.entrySet()方法用于根据Map中包含的相同元素创建集合.它本质上返回Map的集合视图,或者我们可以创建一个新集合并将Map元素存储到其中. 用法: ma ...

最新文章

  1. error: Error: No resource found for attribute ‘layout_scrollFlags’ in package‘包名’
  2. gsoap 学习 1-由wsdl文件生成h头文件
  3. 阿里青橙奖名单公布,23位院士、2位图灵奖得主推荐
  4. 成功解决TypeError: ‘str‘ object is not callable
  5. c#动态修改代码的crackme
  6. 手写一个jsonp实现
  7. java 构造函数抛出异常,构造函数抛出异常;嵌套异常是java.lang.NoClassDefFoundError:javax/servlet/ServletContext...
  8. 京东:应届博士生年薪最高达200万元!确认过眼神,是我羡慕不来的人
  9. Windows下Node.js安装及环境配置
  10. 这个0day 影响启用 Sandbox 的多数 Windows 10 版本
  11. 计算机技术专业求职简历,计算机技术专业求职简历模板
  12. CSS自定义字体,在线字体格式转换
  13. Instrument API介绍
  14. 2022年劳务员-通用基础(劳务员)考试题库及答案
  15. laravel-admin Base table or view not found: 1146 Table ‘hyzt.brands‘ doesn‘t exist (SQL: select coun
  16. 为什么你比同龄人更显老?答案可能和“久坐”有关
  17. 如何制定一个好计划?运用SMART原则
  18. shell下从1加到100
  19. 1024_回首2022我做了啥
  20. java 匿名函数_Java中的lambda匿名函数使用

热门文章

  1. win10的“全新启动”功能,摇身一变为纯净版系统
  2. Ministory—Walden
  3. 剩余电流动作继电器在农畜房屋中的应用-安科瑞耿敏花
  4. 那些宁愿降薪也要跳槽的测试员们,到底图什么?
  5. libvirt-qemu-虚拟机内存分配和内存热插拔
  6. git bfg 的使用(删除提交记录中的敏感信息,删除文件等)
  7. 【ESP 保姆级教程】疯狂毕设篇 —— 案例:基于ESP8266的RFID门禁系统
  8. XBT TRACKER INSTALLATION
  9. VM安装安卓X86问题集锦(安装x86,GRUB引导,跳过console界面)
  10. mysql终端输入密码后闪退的解决方法