`

HashSet集合

阅读更多

    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 来表示。


分享到:
评论

相关推荐

    java HashSet 集合排序

    java HashSet 集合排序,需要通过利用TreeSet集合排序。2013-10-30。

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

    主要介绍了Java HashSet集合存储遍历学生对象代码实例,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下

    hashset集合及红黑树简单随手记

    在JDK1.8之前,哈希表底层采用数组+链表实现,即使用链表处理冲突,同一hash值的链表都存储在一个链表里。

    Java编写的<书籍借阅管理系统>(包含数据库等所有文件!)

    我们上课教学用的一个示例, 不知老师从哪弄来的, 觉得不错就拿上来和大家分享了 ^ ^

    Java基础知识.doc

    内存泄露的另外一种情况:当一个对象被存储进HashSet或HashMap中以后,就不能修改这个对象中的那些参与计算哈希值的字段了,否则,对象修改后的哈希值与最初存储进HashSet集合中时的哈希值就不同了,在这种情况下,...

    hashset类的使用

    这个是关于java语言的hashset集合类的一些基本用法和详解了个方法的使用

    java集合知识-map、set等

    记住:如果元素要存储到HashSet集合中,必须覆盖hashCode方法和equals方法。 一般情况下,如果自定义的类会产生很多对象,比如人,学生,书,通常都需要覆盖equals,hashCode方法。 建立对象判断是否相同的依据。...

    HashSet:一个简单JavaScript设置

    已设置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...

    c++用vector实现HashSet

    c++一个用vector实现java的HashSet集合类,可以将任何类,数字,字符串,vector等等存放到里面

    集合笔记整理.doc

    集合笔记 list arraylist集合 linkedlist集合 set hashset集合 treeset集合 map hashmap集合 terrset集合 不可变集合

    java中Set集合保证元素一致性原理.md

    HashSet集合保证元素一致性

    ypjh001#-#04.Set集合1

    1.HashSet集合介绍 2.HashSet集合存储数据的结构(哈希表) 3.HashSet存储自定义类型元素 5.TreeSet集合 1.特点 2.演示 1

    java集合-HashSet的使用

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

    HashSet,TreeSet和LinkedHashSet的区别1

    简单的说,HashSet集合判断两个元素相等的标准是两个对象通过equals方法比较相等,并且两个对象的hashCode()方法返回值相 等注意,如果要把一个对

    集合框架.xmind

    常见的集合框架:Collection接口和Map接口 以及常见的List接口下实现的ArrayLIst集合,LinkedList集合,Set接口下的HashSet集合和LinkedHashSet集合, Map接口下实现的HashMap集合和LinkedHashMap集合

    集合类HashSet

    hashMap可以通过一个键值与一个对象一一对应的关系找到我们要找的对象,再调用对象里面的方法

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

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

    java学生管理系统_set

    使用HashSet集合存储学生信息,实现增删改查功能

Global site tag (gtag.js) - Google Analytics