`
LQJ2711
  • 浏览: 5422 次
  • 性别: Icon_minigender_1
社区版块
存档分类
最新评论

HashSet集合是如何做到不重复的?

 
阅读更多

这次我们了解一下关于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());
		}
	}
}

 

分享到:
评论

相关推荐

    集合的概念及应用和HashSet保证数据不重复的原理

    标题中的“集合的概念”指的是在计算机科学中,集合是一种数据结构,它可以存储一组不重复的元素。在Java中,集合接口(如List、Set和Map)定义了操作这些元素的方法,如添加、删除和查找。集合框架的设计使得开发者...

    集合类HashSet

    在Java编程语言中,集合类是用于存储一组不重复元素的数据结构。HashSet是其中的一种,它属于集合框架的一部分,提供了一种基于哈希表实现的无序、不可重复的元素集合。本文将深入探讨HashSet类及其相关的知识点。 ...

    Java HashSet集合存储遍历学生对象代码实例

    在本文中,我们将通过一个实例,介绍如何使用Java HashSet集合来存储和遍历学生对象,并解决添加重复元素的问题。 知识点1: HashSet集合的特点 HashSet集合是一种基于哈希表的集合实现,它的特点是: * 不存储...

    java集合-HashSet的使用

    HashSet 是 Java 中的一个集合类,它实现了 Set 接口并提供了基于哈希表的无序、不重复元素的集合。具体来说,它是通过哈希表(实际上是一个 HashMap 实例)来存储元素的。 以下是 HashSet 的一些主要特点: 无序...

    HashSet的实现原理

    在Java编程中,HashSet是一种不允许存储重复元素的集合,它实现了Set接口。HashSet是通过HashMap来实现的,其底层使用HashMap来保存所有元素。这种实现方式让HashSet的操作非常简单高效,因为HashSet的大部分操作,...

    如何去掉list集合中重复的元素?.docx

    Set接口下的集合类如HashSet不存储重复元素,可以方便地去除列表中的重复项。将List转换为Set,然后再转换回List即可: ```java List&lt;PenBean&gt; uniquePenBeanList = new ArrayList(new HashSet(penBeanList)); ``` ...

    hashset类的使用

    它基于哈希表的原理来存储不重复的元素,其核心在于利用哈希算法快速定位元素存储位置,从而提高数据存取的效率。本篇将详细介绍Java语言中HashSet类的使用,包括其继承结构、构造函数、常用方法以及实例演示。 ...

    HashSet详解和使用示例_动力节点Java学院整理

    在实际使用中,理解这些特性可以帮助我们更好地利用HashSet,例如在需要快速查找不重复元素的场景下,或者在单线程环境中,HashSet是一个非常实用的选择。然而,在多线程环境下,为了保证线程安全,可以使用`...

    源码解析jdk7.0集合:HashSet的底层实现原理.pdf

    总结来说,HashSet是通过内部的HashMap来管理集合元素的存储,其特点是没有顺序,不允许重复,并且可以包含null值。在使用HashSet时,应当注意其线程不安全的特性,同时为了保证元素的唯一性,应当合理地重写...

    HashSet去重

    它不允许集合中有重复的元素,并且不保证集合中元素的顺序。`HashSet`之所以能够实现去重功能,主要依赖于其内部实现的哈希算法以及`equals`方法。 #### 二、`HashSet`的基本原理 1. **哈希算法**:`HashSet`基于...

    HashSet类的用法.pdf

    `HashSet`不允许重复的元素,并且不保证元素的顺序。此外,`HashSet`是非同步的,这意味着多线程环境下的安全问题需要通过外部同步机制解决。 #### 二、特点 1. **无序性**:`HashSet`中的元素是无序的,即不能...

    通过实例学习Java集合框架HashSet

    HashSet是Java集合框架中的一种重要数据结构,用于存储不重复的元素。通过实例学习Java集合框架HashSet,可以帮助开发者更好地理解和使用HashSet,提高编程效率和代码质量。本文将通过实例代码详细介绍HashSet的使用...

    第8天(集合【LinkedList、HashSet、Collection集合体系】)v201703103

    **Set集合**\n Set接口是另一种重要的集合类型,它存储不重复的元素。Set接口不保证元素的顺序,但提供了保证元素唯一性的机制。HashSet是最常见的Set实现,基于哈希表实现,元素的插入、删除和查找速度较快。\n\n ...

    第8天(集合【LinkedList、HashSet、Collection集合体系】)v201703104

    Set 集合则不允许元素重复,且无序。Set 接口的实现通常依赖于元素的 equals() 和 hashCode() 方法来判断元素是否重复,确保集合中的唯一性。HashSet 是 Set 的一种实现,它使用哈希表(实际上是一个 HashMap)来...

    生成指定随机数不重复的例子(可用)

    要生成不重复的随机数,我们需要配合使用集合,如`ArrayList`或`HashSet`。 以下是一个基本的实现思路: 1. 创建一个包含所有可能随机数的集合,例如从1到n的整数。 2. 创建一个空集合用于存储生成的不重复随机数...

    java 中HashMap、HashSet、TreeMap、TreeSet判断元素相同的几种方法比较

    HashSet是基于HashMap实现的无序不重复元素集合。当向HashSet中添加元素时,它实际上是将元素作为键存入HashMap,值则忽略。因此,HashSet判断元素是否重复的方式与HashMap类似:首先计算元素的哈希值,然后通过...

    treemap treeset hashset hashmap 简要介绍

    `HashSet`是基于哈希表实现的Set(集合)实现,它不保证集合中元素的任何特定顺序。`HashSet`允许快速添加、删除和查找元素,但不能包含重复的元素。为了正确地工作,`HashSet`要求元素具有良好的`equals()`和`...

    List,Set练习题(no TreeSet).docx

    我们可以使用Random类创建随机数对象,并使用HashSet集合来存储这些随机数,因为HashSet集合具有自动去除重复元素的功能。 在解决这个问题时,我们需要考虑以下几点: * 随机数的生成:我们可以使用Random类的...

    java生成十个不重复的随机数

    由于`HashSet`会自动拒绝重复的元素,因此当集合大小达到10时,我们就得到了10个不重复的随机数。 这个过程可能会有一些效率问题,因为我们可能需要多次尝试才能找到一个未出现过的随机数。如果需要生成的随机数...

Global site tag (gtag.js) - Google Analytics