HashSet集合是如何去除重复元素的。Set集合是没有重复元素的,那是怎样保证集合中元素的唯一性呢?这就得依靠两个方法,hashCode() 和 equals() 方法。
1) 存储元素(对象)的所在类需要重写这两个方法法。至于怎么重写待会再深究。
2) 当HashSet集合对象调用add()方法添加元素时,会调用元素自身的hashCode()方法算出一个值,然后根据这个值去内存中找到自己的位置,如果这个位置没有对象,此元素就存放在这个位置上。
3) 如果这个位置上有对象,则继续调用equals()方法比较,如果equals()方法比较的结果为false,那么证明这两个元素不相同,则在这个位置上存放两个元素。如果equals()方法比较结果为true,那么证明这两个元素相同,则不能存放。
刚才说道怎样重写hashCode()和equals()方法,当然我们一般都是用eclipse自动生成这两个方法。然后我们发现在hashCode()方法中,eclipse定义了一个系数 final int prime = 31; 为什么这个系数是31呢?为什么就不是32或者21呢?之所以乘以31,其实就是为了尽量保证每个对象的哈希值唯一。在存储的时候可以只通过hashCode方法就可以确定其唯一性,就不用再去麻烦equals方法了。
1) 31是个素数(一个大于1的自然数中,除了1和此整数自身外,没法被其他自然数整除的数),这样的数所存在的公倍数就很少。
2) 数据存储和查找都是通过hash地址值,所以尽量保证我们得到的哈希值和真实地址值一一对应,从而提高查找效率,而乘以31这个系数可以保证哈希值足够大,而减少重复,也可以保证得出来的哈希值不溢出。
3) 大家都知道,计算机底层全是二进制,做乘法运算时,使用的是位移运算,如 2*3可以用2 << 3来表示,就是把2对应的2进制向左移动3位。选择31做为系数则是由于一个数乘以31使用位移运算很好计算,如:i * 31 就可以用: (i << 5) -1 来表示。
- 浏览: 118719 次
- 性别:
- 来自: 福建
最新评论
-
wenbing2610:
其实用Struts实现图片上传比用Servlet实现容易多了。 ...
Struts2文件上传深入FileUploadInterceptor -
i_feng:
public class uploadImageAction ...
Struts2文件上传深入FileUploadInterceptor -
wenbing2610:
...
ognl.MethodFailedException
相关推荐
java HashSet 集合排序,需要通过利用TreeSet集合排序。2013-10-30。
Java HashSet集合存储遍历学生对象代码实例 Java HashSet集合是一种基于哈希表的集合实现,用于存储元素的集合。在本文中,我们将通过一个实例,介绍如何使用Java HashSet集合来存储和遍历学生对象,并解决添加重复...
在JDK1.8之前,哈希表底层采用数组+链表实现,即使用链表处理冲突,同一hash值的链表都存储在一个链表里。
我们可以使用Random类创建随机数对象,并使用HashSet集合来存储这些随机数,因为HashSet集合具有自动去除重复元素的功能。 在解决这个问题时,我们需要考虑以下几点: * 随机数的生成:我们可以使用Random类的...
本文将重点讨论基于哈希表的HashSet集合以及哈希值的概念。 1. **Set集合概述和特点** Set集合的主要特点是不允许存储重复元素,元素的存储顺序是不确定的,没有索引,因此不能通过索引访问元素,只能通过迭代器或...
记住:如果元素要存储到HashSet集合中,必须覆盖hashCode方法和equals方法。 一般情况下,如果自定义的类会产生很多对象,比如人,学生,书,通常都需要覆盖equals,hashCode方法。 建立对象判断是否相同的依据。...
已设置JavaScript中的简单哈希集创建一个新的HashSet var HashSet = require ( 'hashset' ) ;//Create an empty hash setvar hashset = new HashSet ( ) ;//Create a hash set an initialize it with a value 'a'var...
HashSet是其中的一种,它属于集合框架的一部分,提供了一种基于哈希表实现的无序、不可重复的元素集合。本文将深入探讨HashSet类及其相关的知识点。 首先,HashSet是由HashMap内部实现的,它利用了键值对(key-...
// 创建一个HashSet集合 Set<String> set = new HashSet(); // 向集合中添加元素 set.add("apple"); set.add("banana"); set.add("orange"); set.add("pear"); // 输出集合大小 System.out.println(...
HashSet集合保证元素一致性
1.HashSet集合介绍 2.HashSet集合存储数据的结构(哈希表) 3.HashSet存储自定义类型元素 5.TreeSet集合 1.特点 2.演示 1
4. List 集合的主要实现类有 ArrayList、LinkedList,Set 集合的主要实现类有 HashSet、TreeSet,Map 集合的主要实现类有 HashMap、TreeMap。 知识点:Java 中的集合框架提供了多种集合类,每种集合类都有其特点和...
在Java编程中,HashSet是一种不允许存储重复元素的集合,它实现了Set接口。HashSet是通过HashMap来实现的,其底层使用HashMap来保存所有元素。这种实现方式让HashSet的操作非常简单高效,因为HashSet的大部分操作,...
HashSet 是 Java 中的一个集合类,它实现了 Set 接口并提供了基于哈希表的无序、不重复元素的集合。具体来说,它是通过哈希表(实际上是一个 HashMap 实例)来存储元素的。 以下是 HashSet 的一些主要特点: 无序...
当向 HashSet 集合中存入一个元素时,HashSet 会调用该对象的 hashCode() 方法来得到该对象的 hashCode 值,然后根据 hashCode 值来决定该对象在 HashSet 中的存储位置。简单地说,HashSet 集合判断两个元素相等的...
在Java语言中,HashSet类是集合框架的重要组成部分,属于Set接口的一个实现。它基于哈希表的原理来存储不重复的元素,其核心在于利用哈希算法快速定位元素存储位置,从而提高数据存取的效率。本篇将详细介绍Java语言...
本项目"java学生管理系统_set"着重于使用HashSet集合来存储和管理学生信息,并实现了基本的增删改查(CRUD)功能。HashSet是Java集合框架中的一个重要类,它不包含重复元素,且不保证元素的顺序,适用于快速查找和...