`

hash算法-JAVA SET

 
阅读更多



 首先数学原理
哈希(Hash)算法就是单向散列算法,它把某个较大的集合P映射到另一个较小的集合Q中,假如这个算法叫H,那么就有Q = H(P)。对于P中任何一个值p都有唯一确定的q与之对应,但是一个q可以对应多个p。作为一个有用的Hash算法,H还应该满足:H(p)速度比较快;给出一个q,很难算出一个p满足q = H(p);给出一个p1,很难算出一个不等于p1的p2使得 H(p1)=H(p2)。

所以一个简单的定义:哈希算法其本质上就是将一个数据映射成另一个数据,通常情况下原数据的长度比hash后的数据容量大。这种映射的关系我们叫做哈希函数或者散列函数。散列函数能使对一个数据序列的访问过程更加迅速有效,通过散列函数,数据元素将被更快地定位。

 

散列方法最经典的莫过于求模取余法。我们知道,任给一个整数A,将自然数1,2,3,4,…依次除以A,所得的余数总是循环出现,呈周期性变化, 所以,我们可以取关键字被某个不大于散列表表长m的数p除后所得的余数为散列地址。即 H(key) = key % p, p<=m。

 

 

必然会有冲突,解决冲突的最经典方法,莫过于”拉链法“,即某个位置填入的不是元素本身,而是一个链表,所有余数相同的元素,都写入该链表。显然链表中的元素要远比原集合中的元素少了很多,这时就可以对链表做遍历比较了。

 



 

装填因子Load factor a=哈希表的实际元素数目(n)/ 哈希表的容量(m) a越大,哈希表冲突的概率越大,但是a越接近0,那么哈希表的空间就越浪费。Java实现的HashMap默认的Load factor的值为0.75,当装载因子大于这个值的时候,HashMap会对数组进行扩张至原来两倍大。

 

然后看看JAVA SET:通过上面,可以知道hashcode其实就是个地址。SET的大概原理,先调用这个元素的hashCode方法,就一下子能定位到它应该放置的物理位置上。 

如果这个位置上没有元素,它就可以直接存储在这个位置上,不用再进行任何比较了;如果这个位置上已经有元素了, 
就调用它的equals方法与新元素进行比较,相同的话就不存了,不相同就散列其它的地址。 
所以这里存在一个冲突解决的问题(应该也是拉链法吧)。这样一来实际调用equals方法的次数就大大降低了,几乎只需要一两次。

 

最后:

Java对于eqauls方法和hashCode方法是这样规定的: 
1、如果两个对象相同,那么它们的hashCode值一定要相同;

2、如果两个对象的hashCode相同,它们并不一定相同     。

也就是说hashcode和equals必须同时存在。  

  • 大小: 8.2 KB
分享到:
评论

相关推荐

    大学课程讲义-Java基础-Java集合.pptx

    HashSet 是 Set 接口的典型实现,使用 Hash 算法来存储集合中的元素,具有很好的存取和查找性能。LinkedHashSet 是 HashSet 的子类,使用链表维护元素的次序,使得元素看起来是以插入顺序保存的。TreeSet 是一个有序...

    百度最新面经-Java 工程师

    本题目涵盖了 Java 工程师所需的知识点,包括 Java 基础、数据库、网络模块、项目介绍和算法题等方面。 Java 基础 * Object 类的方法和使用场景 * equals() 方法的异同 * Java 基础类型和所占的长度 * hash 的时间...

    最新版--Java+最常见的+200++面试题汇总+答案总结汇总.pdf

    * MySQL 的索引类型:B-Tree 索引、Hash 索引等 Redis 知识点: * Redis 的数据类型:String、List、Set 等 * Redis 的应用场景:缓存、分布式锁等 JVM 知识点: * JVM 的架构:Class Loader、Runtime Data ...

    02-Java集合容器面试题-重点.docx

    Java集合容器概述、集合框架、List、Set、Map接口、Iterator、ArrayList、LinkedList、Vector、HashSet、HashMap、Queue、BlockingQueue、ConcurrentHashMap等。 Java 集合容器概述 Java 集合容器是用于存储数据...

    01-JAVA岗位笔试题(A卷)附答案

    - **Hash**:键值对的集合。 #### 八、不属于线程池的选项 题目未给出具体的选项,但通常线程池的组成部分或与之相关的概念包括线程管理、任务队列、线程调度等,而不属于线程池的可能是一些非并发控制相关的类或...

    数据结构常用算法c++实现

    Java's string hash FNV-1a string hash SimHash Bloom Filter SHA-1 Message Digest Algorithm MD5 Base64 Graph data structure Strongly Connected Components(SCC) Prim's minimum spanning tree Kruskal MST ...

    常用数据结构及其算法的Java实现

    在Java中,TreeSet和TreeMap分别实现了Set和Map接口,底层基于红黑树,提供高效的查找、插入和删除操作。 6. 图(Graph) 图由节点和边构成,可以表示复杂的关联关系。图的遍历策略有深度优先搜索(DFS)和广度优先...

    几种简单的负载均衡算法及java实现1

    负载均衡算法及Java实现 负载均衡是指通过某种负载分担技术,将外部发送来的请求均匀分配到对称结构中的某一台服务器上,以解决大量并发访问服务问题。负载均衡能够平均分配客户请求到服务器阵列,借此提供快速获取...

    Java面经.适用于校招

    - Hash算法可以将任意长度的数据映射为固定长度的哈希值。 2.13 迭代器Iterator和Enumeration - Iterator和Enumeration都是用于遍历集合的方法。 2.14 LIST、ArrayList、LinkedList和Vector的区别和实现原理 - ...

    java数据结构和算法

    5. **集合(Collection)框架**:Java提供了一整套集合框架,包括List(ArrayList, LinkedList)、Set(HashSet, TreeSet)和Queue(LinkedList实现的Deque)等接口及其实现类。 6. **映射(Map)**:键值对存储,如...

    Java HashMap类详解

    在介绍集合存储之前需要指出一点:虽然集合号称存储的是 Java 对象,但实际上并不会真正将 Java 对象放入 Set 集合中,只是在 Set 集合中保留这些对象的引用而言。也就是说:Java 集合实际上是多个引用变量所组成的...

    Estructuras-de-datos-java:对应Data Structures主题的实践,java开发

    在“Estructuras-de-datos-java”项目中,我们可能会看到这些数据结构的Java实现,包括它们的增删改查操作以及特定算法的应用,比如排序和搜索。此外,还可能涉及到递归、迭代等编程技巧,以及如何优化时间和空间...

    java面试题及答案-非常全面(包括基础、网络、数据结构、算法及IT大厂面经)

    - **集合框架**:Java中的集合框架主要分为两种类型:`List` 和 `Set`。 - **List**:有序集合,可以包含重复元素。主要实现有`ArrayList`(基于数组)、`LinkedList`(基于双向链表)。 - **Set**:不允许重复...

    java大神进阶之路.pdf

    文中特别强调了数据结构和算法的重要性,以及Java语言的跨平台、面向对象特性,并对Java技术生态中的各种工具和框架进行了介绍。此外,还包括了JVM内存模型、多线程编程、IO流处理、XML解析、网络编程、数据库设计与...

    数据结构 课件java版本

    5. **集合框架**:Java提供了丰富的集合框架,包括Set(不允许重复元素)、List(有序,允许重复元素)和Map(键值对)。HashSet、ArrayList、HashMap分别是它们的常见实现。 6. **树结构**:如二叉树、二叉搜索树...

    JAVA核心知识整理.pdf

    - **HashSet(Hash表实现)**:通过哈希码快速查找。 - **TreeSet(红黑树实现)**:维护排序,插入和查找效率较高。 - **LinkedHashSet**:结合了HashSet和LinkedList的特点,保持插入顺序。

    JAVA核心知识点整理.pdf

    - **SET**:包括HashSet(基于HashMap的Hash表)、TreeSet(基于二叉树)、LinkedHashSet(维护了一个链表来维护插入顺序)。 - **MAP**:包括HashMap(基于数组+链表+红黑树)、ConcurrentHashMap(高效并发的Map)...

    Java算法题,数据结构分析和实现.zip

    在本压缩包“Java算法题,数据结构分析和实现.zip”中,主要涵盖了与Java编程相关的算法题目以及数据结构的深入分析和实现。数据结构是计算机科学中的核心概念,它研究如何有效地组织和存储数据,以便高效地进行访问...

Global site tag (gtag.js) - Google Analytics