散列是无需查找,只用元素的查找键来确定元素索引的方法。散列函数就是一种用来实现散列的函数,它接受一个查找键,计算出该键的散列码,然后再将此散列码压缩到散列表的范围内。在用散列来实现某种数据结构的时候,往往会遇到冲突的情况(不同的查找键有相同的散列码)此时就需要我们去处理冲突,而处理冲突的方法有两种:
第一种:使用散列表的另一个位置。这里又可以采用三种不同的方法:
1 : 线性探测开放定址法。此方法会导致一次聚集。
2 ; 二次探测开放定址法。此方法会导致二次聚集。
3 : 双散列开放定址法 。使用次方时要保证散列表元素是素数。因为只有这样才能探测到散列表中的所有位置。并且可以使元素均匀的分布到散列表中,避免了聚集。
第二种:利用桶来处理冲突
此方法要用到桶这个东东,桶一般用链表来实现,因为这样可以节约内存。此时的方法也可以叫链地址法。JAVA中的HashMap就是用桶来处理冲突的。
散列里还有一个重要的概念就是装填因子。它是一个浮点数。在具体实现中,它是所有元素的个数与散列表位置的比值。它主要是用来决定是否要再散列的。不过在具体实现中要尽量避免再散列。在散列的开销很大。装填因子它也从一个侧面表示了程序中速度相对于内存使用的重要性:如果值低就表示注重的是速度,如果值高就表示注重的是内存的使用。不过无论采用何种处理冲突的方法,装填因子都有一个限制,对于第一种来说,规定装填因子要小于0.5,而对于第二种要求装填因子要小于1.0.
JAVA中的很多集合类使用了散列这种方法。HashMap就是其中之一。并且HashSet底层也是用HashMap来存储它的元素,因为用到了散列,所以这两种集合类都不能保证元素的添加顺序。此外在对HashMap和HashSet操作时,特别注意两个方法:equals()和hasCode(),List接口用equals()来判断两个元素是否相同。而HashSet首先用hasCode()来算出两个元素的哈希吗,如果哈希吗不同,则两元素不同。如果哈希吗相同,那么就要用equals()方法来判断两个元素是否相同,如果equals()返回真,则相同,否则不相同。这就要求当我们的equals()方法返回真时,一定要保证这两个对象有相同的哈希吗。
分享到:
相关推荐
"Java集合面试题 52道" Java 集合框架是 Java 编程语言中的一种重要组件,它提供了一种方便的方式来存储和操作数据。在 Java 中,集合框架主要有三种类型:Set、List 和 Map,这三种类型的集合框架都有其特点和应用...
在Java中,集合框架是指Java提供的一些实现常见数据结构的类,如链表、堆栈、散列映射、树集、树映射等。这些类称作Java集合框架。在JDK1.5后,Java集合框架开始支持泛型。 Java集合框架的主要组成部分包括...
常用的集合类有 ArrayList、LinkedList、HashSet 等。ArrayList 是一个数组列表,用于存储大量数据。LinkedList 是一个链表,用于存储数据并提供高效的插入和删除操作。HashSet 是一个散列集合,用于存储唯一的数据...
Jedis 是 Redis 官网首选的 Java 客户端开发包,通过 Jedis,我们可以在 Java 中使用 Redis。Jedis 的使用非常简单,首先需要引入相关的 jar 包,然后创建连接实例,最后使用 Jedis 操作 Redis。 Redis 的特点 ...
Java是一种广泛使用的编程语言,特别是在企业级应用...以上就是Java面试中常见的几个关键知识点,包括内存分配、Object类的方法、数据结构的选择以及集合操作。理解这些基础概念对于成为一名优秀的Java开发者至关重要。
1.5.1 单向散列函数 7 1.5.2 对称密码 8 1.5.3 非对称密码 9 1.6 鉴别 9 1.7 移动代码 10 1.8 Java安全性的适用范围 11 第2章 Java语言的基本安全特点 12 2.1 Java语言和平台 12 2.2 基本安全结构 13 2.3 字节代码...
并在此基础上,详细描述了Java 2平台中新增加的许多安全结构方面的措施,同时对Java安全性的实施提出了使用指导,描绘了如何定制、扩展和精化安全结构以及成功实现的技术细节。本书为建立安全、有效、强大和可移植的...
本书首先介绍了Java中需要特别掌握的部分,然后讨论了程序设计中类、继承、多态性、递归和复杂度分析等概念,最后还介绍了线程和同步技术。 目录: 第一章类与对象 第二章类之间的关系 第三章类的设计 第四章算法...
表、栈和队列3.1 抽象数据类型3.2 表ADT3.2.1 表的简单数组实现3.2.2 简单链表3.3 JavaCollectionsAPI中的表3.3.1 Collection接口3.3.2 Iterator接口3.3.3 List接口、ArrayList类和LinkedList类3.3.4 例:remove...
表、栈和队列3.1 抽象数据类型3.2 表ADT3.2.1 表的简单数组实现3.2.2 简单链表3.3 JavaCollectionsAPI中的表3.3.1 Collection接口3.3.2 Iterator接口3.3.3 List接口、ArrayList类和LinkedList类3.3.4 例:remove...
表、栈和队列3.1 抽象数据类型3.2 表ADT3.2.1 表的简单数组实现3.2.2 简单链表3.3 JavaCollectionsAPI中的表3.3.1 Collection接口3.3.2 Iterator接口3.3.3 List接口、ArrayList类和LinkedList类3.3.4 例:remove...
4.8 标准库中的集合与映射 4.8.1 关于Set接口 4.8.2 关于Map接口 4.8.3 TreeSet类和TreeMap类的实现 4.8.4 使用多个映射的例 小结 练习 参考文献 第5章 散列 5.1 一般想法 5.2 散列函数 5.3 分离链接法 5.4 不用...
4.5.1 一个简单的想法(不能直接使用) 4.5.2 展开 4.6 树的遍历 4.7 b树 4.8 标准库中的集合与映射 4.8.1 关于set接口 4.8.2 关于map接口 4.8.3 treeset类和treemap类的实现 4.8.4 使用多个映射...
4.5.1 一个简单的想法(不能直接使用) 4.5.2 展开 4.6 树的遍历 4.7 b树 4.8 标准库中的集合与映射 4.8.1 关于set接口 4.8.2 关于map接口 4.8.3 treeset类和treemap类的实现 4.8.4 使用多个映射...
【基础】一个".java"源文件中是否可以包含多个类(不是内部类)?有什么限制? 30 【基础】Anonymous Inner Class(匿名内部类)是否可以继承其它类?是否可以实现接口? 30 【基础】Java 中的final关键字有哪些用法?...