这次我们了解一下关于HashSet集合如何做到重复的。(这次的文章改编于网上某篇文章,但是又加入了我对于HashSet集合的一些理解,望谅解!)
Java中关于HashSet添加自定义对象时,自定义类要重写equals方法和hashCode方法的前世今生...
先了解一下HashSet集合的基本情况:
据我所知HashSet集合是没有顺序,也不允许重复[对象的重复]。
对象的重复:指的就是在内存中,所在的内存编号一样的同一个对象。
内存编号指的就是哈希码(哈希码一般是类名和对象所在内存地址的十六进制数字表示 的组合)。
然后了解一下相关的知识:
现实生活中只要属性相同,我们就认为那是同一个对象。
计算机中比较同一个对象的方法不同[计算机使用内存地址,即哈希码]。
于是,就需要重写equals方法和hashCode方法来让程序的运行结果符合现实生活,不同的类对于equals方法和hashCode方法的要求不一样。
附:基本数据类型的实现类都已经重写了上面的两个方法。
技术实现原理:
当你利用HashSet创建一个对象时,在HashSet的构造方法中,先用hashCode方法计算出该对象的哈希码。
比较顺序以及原理
(1).如果该对象哈希码与集合已存在对象的哈希码不一致,则该对象没有与其他对象重复,添加到集合中!
(2).如果存在于该对象相同的哈希码,那么通过equals方法判断两个哈希码相同的对象是否为同一对象(判断的标准是:属性是否相同)
1>.相同对象,不添加!
2>.不同对象,添加!
这时有两个疑问:
1.为什么哈希码相同了还有可能是不同对象?
按照Object类的hashCode方法,是不可能返回两个相同的哈希码的。(哈希码唯一标志了对象)
Object类的hashCode方法返回的哈希码具有唯一性(地址唯一性),但是这样不能明确的确定两者是不是同一个对象。(这个逻辑就是:属性相同的对象被看作同一个对象。)
所以综上所述两个对象重复的标准:哈希码相同且属性相同。
2.为什么经过比较哈希码还需要借助equals方法判断?
为了让程序的运行逻辑符合现实生活,区分哈希码相同但不是同一个对象的对象。(自定义的类要你自己重写。)
重写的原因是什么?
在现实中,不同的类对于equals方法和hashCode方法的要求不一样。
一个自定义的类:
package LQJ.newer.a3; public class person { private String name; public person(String name) { this.name = name; } //重写的hashCode方法 @Override public int hashCode() { return name.hashCode(); } //重写的equals方法 @Override public boolean equals(Object obj) { if (this == obj){ return true; } if (obj instanceof person){ person p = (person) obj; return this.name.endsWith(p.name); } return false; } //重写的toString方法 @Override public String toString() { return name; } }
主类调用:
package LQJ.newer.a3; import java.util.HashSet; import java.util.Iterator; public class HashSetMAIN { public static void main(String[] args) { HashSet<person> set = new HashSet<person>(); set.add(new person("张三")); set.add(new person("王二")); set.add(new person("刘四")); set.add(new person("李武")); set.add(new person("剑皇")); set.add(new person("王二")); // 迭代器对象:用来对数据结构取数据的一个对象 // 得到set的迭代器 Iterator<person> iter = set.iterator(); // 判断迭代器中能不能迭代出数据 while (iter.hasNext()) { // 取出数据 person s = iter.next(); System.out.println(s.toString()); } } }
相关推荐
标题中的“集合的概念”指的是在计算机科学中,集合是一种数据结构,它可以存储一组不重复的元素。在Java中,集合接口(如List、Set和Map)定义了操作这些元素的方法,如添加、删除和查找。集合框架的设计使得开发者...
在Java编程语言中,集合类是用于存储一组不重复元素的数据结构。HashSet是其中的一种,它属于集合框架的一部分,提供了一种基于哈希表实现的无序、不可重复的元素集合。本文将深入探讨HashSet类及其相关的知识点。 ...
在本文中,我们将通过一个实例,介绍如何使用Java HashSet集合来存储和遍历学生对象,并解决添加重复元素的问题。 知识点1: HashSet集合的特点 HashSet集合是一种基于哈希表的集合实现,它的特点是: * 不存储...
HashSet 是 Java 中的一个集合类,它实现了 Set 接口并提供了基于哈希表的无序、不重复元素的集合。具体来说,它是通过哈希表(实际上是一个 HashMap 实例)来存储元素的。 以下是 HashSet 的一些主要特点: 无序...
在Java编程中,HashSet是一种不允许存储重复元素的集合,它实现了Set接口。HashSet是通过HashMap来实现的,其底层使用HashMap来保存所有元素。这种实现方式让HashSet的操作非常简单高效,因为HashSet的大部分操作,...
Set接口下的集合类如HashSet不存储重复元素,可以方便地去除列表中的重复项。将List转换为Set,然后再转换回List即可: ```java List<PenBean> uniquePenBeanList = new ArrayList(new HashSet(penBeanList)); ``` ...
它基于哈希表的原理来存储不重复的元素,其核心在于利用哈希算法快速定位元素存储位置,从而提高数据存取的效率。本篇将详细介绍Java语言中HashSet类的使用,包括其继承结构、构造函数、常用方法以及实例演示。 ...
在实际使用中,理解这些特性可以帮助我们更好地利用HashSet,例如在需要快速查找不重复元素的场景下,或者在单线程环境中,HashSet是一个非常实用的选择。然而,在多线程环境下,为了保证线程安全,可以使用`...
总结来说,HashSet是通过内部的HashMap来管理集合元素的存储,其特点是没有顺序,不允许重复,并且可以包含null值。在使用HashSet时,应当注意其线程不安全的特性,同时为了保证元素的唯一性,应当合理地重写...
它不允许集合中有重复的元素,并且不保证集合中元素的顺序。`HashSet`之所以能够实现去重功能,主要依赖于其内部实现的哈希算法以及`equals`方法。 #### 二、`HashSet`的基本原理 1. **哈希算法**:`HashSet`基于...
`HashSet`不允许重复的元素,并且不保证元素的顺序。此外,`HashSet`是非同步的,这意味着多线程环境下的安全问题需要通过外部同步机制解决。 #### 二、特点 1. **无序性**:`HashSet`中的元素是无序的,即不能...
HashSet是Java集合框架中的一种重要数据结构,用于存储不重复的元素。通过实例学习Java集合框架HashSet,可以帮助开发者更好地理解和使用HashSet,提高编程效率和代码质量。本文将通过实例代码详细介绍HashSet的使用...
**Set集合**\n Set接口是另一种重要的集合类型,它存储不重复的元素。Set接口不保证元素的顺序,但提供了保证元素唯一性的机制。HashSet是最常见的Set实现,基于哈希表实现,元素的插入、删除和查找速度较快。\n\n ...
Set 集合则不允许元素重复,且无序。Set 接口的实现通常依赖于元素的 equals() 和 hashCode() 方法来判断元素是否重复,确保集合中的唯一性。HashSet 是 Set 的一种实现,它使用哈希表(实际上是一个 HashMap)来...
要生成不重复的随机数,我们需要配合使用集合,如`ArrayList`或`HashSet`。 以下是一个基本的实现思路: 1. 创建一个包含所有可能随机数的集合,例如从1到n的整数。 2. 创建一个空集合用于存储生成的不重复随机数...
HashSet是基于HashMap实现的无序不重复元素集合。当向HashSet中添加元素时,它实际上是将元素作为键存入HashMap,值则忽略。因此,HashSet判断元素是否重复的方式与HashMap类似:首先计算元素的哈希值,然后通过...
`HashSet`是基于哈希表实现的Set(集合)实现,它不保证集合中元素的任何特定顺序。`HashSet`允许快速添加、删除和查找元素,但不能包含重复的元素。为了正确地工作,`HashSet`要求元素具有良好的`equals()`和`...
我们可以使用Random类创建随机数对象,并使用HashSet集合来存储这些随机数,因为HashSet集合具有自动去除重复元素的功能。 在解决这个问题时,我们需要考虑以下几点: * 随机数的生成:我们可以使用Random类的...
由于`HashSet`会自动拒绝重复的元素,因此当集合大小达到10时,我们就得到了10个不重复的随机数。 这个过程可能会有一些效率问题,因为我们可能需要多次尝试才能找到一个未出现过的随机数。如果需要生成的随机数...