首先数学原理:哈希(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必须同时存在。
相关推荐
HashSet 是 Set 接口的典型实现,使用 Hash 算法来存储集合中的元素,具有很好的存取和查找性能。LinkedHashSet 是 HashSet 的子类,使用链表维护元素的次序,使得元素看起来是以插入顺序保存的。TreeSet 是一个有序...
本题目涵盖了 Java 工程师所需的知识点,包括 Java 基础、数据库、网络模块、项目介绍和算法题等方面。 Java 基础 * Object 类的方法和使用场景 * equals() 方法的异同 * Java 基础类型和所占的长度 * hash 的时间...
* MySQL 的索引类型:B-Tree 索引、Hash 索引等 Redis 知识点: * Redis 的数据类型:String、List、Set 等 * Redis 的应用场景:缓存、分布式锁等 JVM 知识点: * JVM 的架构:Class Loader、Runtime Data ...
Java集合容器概述、集合框架、List、Set、Map接口、Iterator、ArrayList、LinkedList、Vector、HashSet、HashMap、Queue、BlockingQueue、ConcurrentHashMap等。 Java 集合容器概述 Java 集合容器是用于存储数据...
- **Hash**:键值对的集合。 #### 八、不属于线程池的选项 题目未给出具体的选项,但通常线程池的组成部分或与之相关的概念包括线程管理、任务队列、线程调度等,而不属于线程池的可能是一些非并发控制相关的类或...
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中,TreeSet和TreeMap分别实现了Set和Map接口,底层基于红黑树,提供高效的查找、插入和删除操作。 6. 图(Graph) 图由节点和边构成,可以表示复杂的关联关系。图的遍历策略有深度优先搜索(DFS)和广度优先...
负载均衡算法及Java实现 负载均衡是指通过某种负载分担技术,将外部发送来的请求均匀分配到对称结构中的某一台服务器上,以解决大量并发访问服务问题。负载均衡能够平均分配客户请求到服务器阵列,借此提供快速获取...
- Hash算法可以将任意长度的数据映射为固定长度的哈希值。 2.13 迭代器Iterator和Enumeration - Iterator和Enumeration都是用于遍历集合的方法。 2.14 LIST、ArrayList、LinkedList和Vector的区别和实现原理 - ...
5. **集合(Collection)框架**:Java提供了一整套集合框架,包括List(ArrayList, LinkedList)、Set(HashSet, TreeSet)和Queue(LinkedList实现的Deque)等接口及其实现类。 6. **映射(Map)**:键值对存储,如...
在介绍集合存储之前需要指出一点:虽然集合号称存储的是 Java 对象,但实际上并不会真正将 Java 对象放入 Set 集合中,只是在 Set 集合中保留这些对象的引用而言。也就是说:Java 集合实际上是多个引用变量所组成的...
在“Estructuras-de-datos-java”项目中,我们可能会看到这些数据结构的Java实现,包括它们的增删改查操作以及特定算法的应用,比如排序和搜索。此外,还可能涉及到递归、迭代等编程技巧,以及如何优化时间和空间...
- **集合框架**:Java中的集合框架主要分为两种类型:`List` 和 `Set`。 - **List**:有序集合,可以包含重复元素。主要实现有`ArrayList`(基于数组)、`LinkedList`(基于双向链表)。 - **Set**:不允许重复...
文中特别强调了数据结构和算法的重要性,以及Java语言的跨平台、面向对象特性,并对Java技术生态中的各种工具和框架进行了介绍。此外,还包括了JVM内存模型、多线程编程、IO流处理、XML解析、网络编程、数据库设计与...
5. **集合框架**:Java提供了丰富的集合框架,包括Set(不允许重复元素)、List(有序,允许重复元素)和Map(键值对)。HashSet、ArrayList、HashMap分别是它们的常见实现。 6. **树结构**:如二叉树、二叉搜索树...
- **HashSet(Hash表实现)**:通过哈希码快速查找。 - **TreeSet(红黑树实现)**:维护排序,插入和查找效率较高。 - **LinkedHashSet**:结合了HashSet和LinkedList的特点,保持插入顺序。
- **SET**:包括HashSet(基于HashMap的Hash表)、TreeSet(基于二叉树)、LinkedHashSet(维护了一个链表来维护插入顺序)。 - **MAP**:包括HashMap(基于数组+链表+红黑树)、ConcurrentHashMap(高效并发的Map)...
在本压缩包“Java算法题,数据结构分析和实现.zip”中,主要涵盖了与Java编程相关的算法题目以及数据结构的深入分析和实现。数据结构是计算机科学中的核心概念,它研究如何有效地组织和存储数据,以便高效地进行访问...