Hash(4) hashtable,hashmap
首先,我们要知道set是利使用map是实现的,因为只要利用map中的key唯一性就行了。
1.hashmap 和hashtable的区别是什么?
我们可以背出: hashtable线程安全。hashmap不安全。
hashmap中key 和value可以为空,当然根据唯一性,只能有一个key为null;
还有呢,hash函数不同下面再谈)
2.我们在知识点回顾中,对于一个hash函数,有哪些方法,如何解决冲突/
除留余数法(最常用),平方取中,随机数法
开放地址法,拉链法
3、那么hashmap中和hashtablehash函数是什么呢?如何解决冲突的呢。
解决冲突是拉链法,就是加链表。
那么hash函数呢,
hashmap 比较高级,我们看hashmap,如果你复习一下数据结构,在哈希表中,他会告诉你,一个hash表就是个数组,这个数组有大小,同时还有装载因子,
size*loadFactor就是我们能存元素个数的最大值,这个值叫做阈(yu)值,超过这个值,就会resize,意思就是重新扩张数组,然后对老元素重新hash,所以resize很费时。
hashmap在size上下了功夫,他把数组的大小设置为2的n次方,初始为16.,如果不够用就成2倍扩张。为什么设置为2的n次方呢?
这样可以充分利用位运算的优势。比如 a*2 表示成 a<<1, 那么 a%16=a&1 5=a&(1111)=a的二级制的后面4为,在位图中我们a%32=a&31
其实如果我们看 a&1=a%2 a&3=a%4 好了,下面我们看看它的hash函数吧
static int indexFor(int h, int length) {return h & (length-1);}
看到没有直接风骚的使用h&(length-1)而且length是2的倍数。其实就是h%(length)
慢着,这个函数有什么缺陷呢?当size比较小的时候,比如32的时候,也就是(11111),最后根据key确定位置的时候,是根据key的后5位确定的,而key,函数中使用h表示,是int型啊,32位的数只能通过后五位确定,这样冲突会很多,我们希望32位的每一位都被考虑进来。都可以决定key的位置,于是,
1 static int hash(int h) { 2 // This function ensures that hashCodes that differ only by 3 // constant multiples at each bit position have a bounded 4 // number of collisions (approximately 8 at default load factor). 5 h ^= (h >>> 20) ^ (h >>> 12); 6 return h ^ (h >>> 7) ^ (h >>> 4); 7 }
我们看到了,这个复杂的代码,它的意思就是我刚才说的,通过移位和异或让更多的位决定key的位置,这样会减少冲突,更均匀。
但是hashtable,虽说是线程安全的,但是他是jdk1.0引入的很老,它的hash函数很普通,
int index = (hash & 0x7FFFFFFF) % tab.length; //hash就是key的hashcode,然后获得非符号位(hashcode为 int,可能为负,所以去掉符号位);
对于线程安全,以后再仔细说。
http://zhangshixi.iteye.com/blog/672697
转载于:https://www.cnblogs.com/hansongjiang/p/3836750.html
Hash(4) hashtable,hashmap相关推荐
- 源码解析-深刻理解Hash HashTable HashMap原理及数据hash碰撞问题
HashMap 前言 Hash HashTable 开地址法 线性探测法 平方探测法 双重散列探测法 拉链法 哈希表优势 HashMap 变量介绍 初始容量和负载因子 红黑树和链表转化 HashMap ...
- 关于hash,hashCode, hashMap,红黑树
小刘老师讲HashMap源码 小刘老师讲红黑树 hash,hashCode,hashMap 1.前提知识 数组: 列表: 散列表 什么是hash? hash也称散列,哈希,基本原理就是把任意长度的输入 ...
- Vector ArrayList Hashtable HashMap ArrayList LinkedList
1. Vector & ArrayList 1) Vector的方法都是同步的(Synchronized),是线程安全的(thread-safe),而ArrayList的方法不是,由于线程的 ...
- hash表和hashmap
hash表和hashmap 一.哈希表 哈希(hash)表:在哈希表中进行添加,删除,查找等操作,性能十分之高,不考虑哈希冲突的情况下(后面会探讨下哈希冲突的情况),仅需一次定位即可完成,时间复杂度为 ...
- [转]Vector、ArrayList和hashtable hashmap数据结构
线性表,链表,哈希表是常用的数据结构,在进行Java开发时,JDK已经为我们提供了一系列相应的类来实现基本的数据结构.这些类均在java.util包中.本文试图通过简单的描述,向读者阐述各个类的作用以 ...
- 浅谈HashTable, HashMap, ConcurrentHashMap 之间的区别
大家好,今天为大家带来新的知识, HashTable, HashMap, ConcurrentHashMap 之间的区别 ...
- 聊聊传说中的散列哈希Hash算法,以及Java中的HashTable,HashMap,HashSet,ConcurrentHashMap......
建议本文结合java源码来阅读,看了之后就什么都懂了,还有参考文献. 散列(Hash) 是一种按关键字编址的存储和检索方法 散列表(HashTable)根据元素的关键字确定元素的位置 散列函数(Has ...
- HashTable, HashMap, LinkedHashMap, ConcurrentHashMap
HashTable: 不允许null的key或value, 线程安全 HashMap: 允许一个null的key, 无限的null value, 非线程安全 LinkedHashMap: HashMa ...
- java+线程安全的hash,多线程下HashMap安全问题-ConcurrentHashMap解析
Java1.5 引入了 java.util.concurrent 包,其中 Collection 类的实现允许在运行过程中修改集合对象.实际上, Java 的集合框架是[迭代器设计模式]的一个很好的实 ...
最新文章
- 2019/5/12 查漏补缺
- 【错误记录】Android Studio 配置 AspectJ 报错 ( all buildscript {} blocks must appear before any plugins {} )
- 微信红包要哭了...给抢红包设计一个新交互
- 信息学奥赛一本通(C++)在线评测系统——基础(一)C++语言——1092:求出e的值
- C++编程思想:C++string
- HDU 1727 Hastiness(模拟)
- CF1592E Bored Bakry
- 自然语言处理实践Task4
- 几种开源许可协议(转载)
- 巨波公第3子登国公后裔在荆州(巨波公6子的后裔,全部水落石出)
- 生活随记 - NBA总决赛第6场 球迷有感
- MSN的聊天记录在哪里找到?
- Java爬取彼岸桌面壁纸的实现(使用Jsoup)
- Android api升级到31 导致的兼容性问题
- pygame 学习笔记(7)添加一个精灵:坦克的移动和旋转
- 蚂蚱蚂蚱,我的骄傲放纵。
- 【67】PCIe Power Management和linux对PME的处理
- webhook是什么?
- gdufe acm 1086 互质数
- ID card No.
热门文章
- python中扑克牌类设计_Python类的基础设计、使用
- putty 中文乱码
- 【CKEditor】下载历史版本4.8.x
- linux下执行shell脚本文件,Linux下使用shell脚本自动执行脚本文件
- date样式找不到_涡轮+国VI排放,顶配售价不到12万,家用轿车看它准没错
- php 使用压缩css文件,PHP-使用GZIP压缩静态CSS文件
- 八皇后问题python_python求解八皇后问题
- java高并发(三)并发编程的基础
- 算法导论学习笔记 6.5 优先队列
- GUI实战|Python做一个文档图片提取软件