文档章节

HashMap底层实现原理,以及和Hashtable的比较

 懿宁19931210
发布于 2017/09/12 10:25
字数 507
阅读 14
收藏 0

我们要知道HashMap底层实现是数组(Entry类型)加上链表的数据结构---拉链法实现哈希表Entry 实现了Map.Entry 接口,即实现getKey(), getValue(), setValue(V value), equals(Object o), hashCode()这些函数。

1.通过hash()函数,计算key对应的哈希值,找到数组中存储位置,在冲突(不同的关键字,对应相同的哈希值,在)较少的情况下,他的查询效率是很高的,如果发生冲突就在数组元素所在链表的表头插入该值,所以在查找HashMap时候有两个关键函数,一个是hash()函数找到key在数组中的位置,一个是equals()函数,在链表中找到key,返回value,通常返回某关键字时候用的判断方法:(key==null ? k==null :key.equlas(k)),可见关键字可以为null

   2.Hashtable 的实例有两个参数影响其性能:初始容量 和 加载因子。容量是哈希表中桶的数量,初始容量 就是哈希表创建时的容量。注意,哈希表的状态为 open:在发生“哈希冲突”的情况下,单个桶会存储多个条目,这些条目必须按顺序搜索。加载因子是对哈希表在其容量自动增加之前可以达到多满的一个尺度。初始容量和加载因子这两个参数只是对该实现的提示。关于何时以及是否调用 rehash 方法的具体细节则依赖于该实现。通常,默认加载因子是 0.75(当数据元素个数达到数组总容量的75%时候,要对数组进行动态扩展), 这是在时间和空间成本上寻求一种折衷。加载因子过高虽然减少了空间开销,但同时也增加了查找某个条目的时间(在大多数 Hashtable 操作中,包括 get 和 put 操作,都反映了这一点)。

© 著作权归作者所有

共有 人打赏支持
粉丝 0
博文 37
码字总数 10902
作品 0
包头
Java常见面试题及答案 21-30(集合类)

21.HashMap的工作原理是什么? HashMap内部是通过一个数组实现的,只是这个数组比较特殊,数组里存储的元素是一个Entry实体(jdk 8为Node),这个Entry实体主要包含key、value以及一个指向自身的...

t4i2b10x4c22nf6a
2017/12/18
0
0
hashmap实现原理浅析

看了下JAVA里面有HashMap、Hashtable、HashSet三种hash集合的实现源码,这里总结下,理解错误的地方还望指正 HashMap和Hashtable的区别 HashSet和HashMap、Hashtable的区别 HashMap和Hashtab...

商者
2016/03/30
37
0
HashMap和HashTable简介和区别

一、HashMap简介 HashMap是基于哈希表实现的,每一个元素是一个key-value对,其内部通过单链表解决冲突问题,容量不足(超过了阀值)时,同样会自动增长。 HashMap是非线程安全的,只是用于单...

光明辉煌
04/17
0
0
[收藏文章]Java岗位面试题

一、Java基础 1. String类为什么是final的。 final修饰的类不能被继承,即它不能拥有自己的子类,否在会在编译期间报错。 final修饰的方法不能被重写 final修饰的变量,无论是类属性、对象属...

vaneL
01/05
0
0
HashTable原理和底层实现

1. 概述 上次讨论了HashMap的结构,原理和实现,本文来对Map家族的另外一个常用集合HashTable进行介绍。HashTable和HashMap两种集合非常相似,经常被各种面试官问到两者的区别。 对于两者的区...

道可
01/27
0
0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

使用esp8266制作wifi干扰器

概述 这个东西,说真的对现在的无线网络环境影响其实不是很大了,首先它只能玩2.4ghz的无线,其次这个模块不是特别的可靠,运行的时候温度会很高,买来玩玩还是可以的 什么是esp8266 ESP8266...

bboysoulcn
12分钟前
0
0
以太坊总结

一、概念说明 1.以太坊(Ethereum blockchain)由V神(Vitalik Buterin)发明,是一个交易记录的永久数据库,它以一个“无信任”的交易系统来运行,不需要任何第三方信任机构即可进行点对点的...

盼望明天
37分钟前
1
0
Java并发工具类——AtomicInteger

基本类型int的递增等操作并不是线程安全的,加上synchronized又会影响性能,因此在并发情况下我们应该使用AtomicInteger,下面通过一个例子验证一哈。 public class TestAtomicInteger {...

东都大狼狗
39分钟前
1
0
基于CentOS7.2系统对RabbitMQ单机版安装过程

准备虚拟机系统 我的系统如下 系统版本7.2 安装perl yum install perl 安装wget工具 yum install -y wget 安装相关依赖工具 yum install ncurses ncurses-base ncurses-devel ncurses-libs ...

凌晨一点
43分钟前
1
0
Maven常用命令

Maven常用命令 说到命令,则不得不提一下环境变量,在之前的博文中简单提了一下环境变量的配置,这里具体说一下。说完环境变量的配置,然后就是Maven的常用命令,这里说的是常用的几个命令,...

星汉
59分钟前
0
0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部