首先,我们要知道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相关推荐

  1. 源码解析-深刻理解Hash HashTable HashMap原理及数据hash碰撞问题

    HashMap 前言 Hash HashTable 开地址法 线性探测法 平方探测法 双重散列探测法 拉链法 哈希表优势 HashMap 变量介绍 初始容量和负载因子 红黑树和链表转化 HashMap ...

  2. 关于hash,hashCode, hashMap,红黑树

    小刘老师讲HashMap源码 小刘老师讲红黑树 hash,hashCode,hashMap 1.前提知识 数组: 列表: 散列表 什么是hash? hash也称散列,哈希,基本原理就是把任意长度的输入 ...

  3. Vector ArrayList Hashtable HashMap ArrayList LinkedList

    1. Vector & ArrayList 1)  Vector的方法都是同步的(Synchronized),是线程安全的(thread-safe),而ArrayList的方法不是,由于线程的 ...

  4. hash表和hashmap

    hash表和hashmap 一.哈希表 哈希(hash)表:在哈希表中进行添加,删除,查找等操作,性能十分之高,不考虑哈希冲突的情况下(后面会探讨下哈希冲突的情况),仅需一次定位即可完成,时间复杂度为 ...

  5. [转]Vector、ArrayList和hashtable hashmap数据结构

    线性表,链表,哈希表是常用的数据结构,在进行Java开发时,JDK已经为我们提供了一系列相应的类来实现基本的数据结构.这些类均在java.util包中.本文试图通过简单的描述,向读者阐述各个类的作用以 ...

  6. 浅谈HashTable, HashMap, ConcurrentHashMap 之间的区别

           大家好,今天为大家带来新的知识,  HashTable, HashMap, ConcurrentHashMap 之间的区别                                ...

  7. 聊聊传说中的散列哈希Hash算法,以及Java中的HashTable,HashMap,HashSet,ConcurrentHashMap......

    建议本文结合java源码来阅读,看了之后就什么都懂了,还有参考文献. 散列(Hash) 是一种按关键字编址的存储和检索方法 散列表(HashTable)根据元素的关键字确定元素的位置 散列函数(Has ...

  8. HashTable, HashMap, LinkedHashMap, ConcurrentHashMap

    HashTable: 不允许null的key或value, 线程安全 HashMap: 允许一个null的key, 无限的null value, 非线程安全 LinkedHashMap: HashMa ...

  9. java+线程安全的hash,多线程下HashMap安全问题-ConcurrentHashMap解析

    Java1.5 引入了 java.util.concurrent 包,其中 Collection 类的实现允许在运行过程中修改集合对象.实际上, Java 的集合框架是[迭代器设计模式]的一个很好的实 ...

最新文章

  1. 2019/5/12 查漏补缺
  2. 【错误记录】Android Studio 配置 AspectJ 报错 ( all buildscript {} blocks must appear before any plugins {} )
  3. 微信红包要哭了...给抢红包设计一个新交互
  4. 信息学奥赛一本通(C++)在线评测系统——基础(一)C++语言——1092:求出e的值
  5. C++编程思想:C++string
  6. HDU 1727 Hastiness(模拟)
  7. CF1592E Bored Bakry
  8. 自然语言处理实践Task4
  9. 几种开源许可协议(转载)
  10. 巨波公第3子登国公后裔在荆州(巨波公6子的后裔,全部水落石出)
  11. 生活随记 - NBA总决赛第6场 球迷有感
  12. MSN的聊天记录在哪里找到?
  13. Java爬取彼岸桌面壁纸的实现(使用Jsoup)
  14. Android api升级到31 导致的兼容性问题
  15. pygame 学习笔记(7)添加一个精灵:坦克的移动和旋转
  16. 蚂蚱蚂蚱,我的骄傲放纵。
  17. 【67】PCIe Power Management和linux对PME的处理
  18. webhook是什么?
  19. gdufe acm 1086 互质数
  20. ID card No.

热门文章

  1. python中扑克牌类设计_Python类的基础设计、使用
  2. putty 中文乱码
  3. 【CKEditor】下载历史版本4.8.x
  4. linux下执行shell脚本文件,Linux下使用shell脚本自动执行脚本文件
  5. date样式找不到_涡轮+国VI排放,顶配售价不到12万,家用轿车看它准没错
  6. php 使用压缩css文件,PHP-使用GZIP压缩静态CSS文件
  7. 八皇后问题python_python求解八皇后问题
  8. java高并发(三)并发编程的基础
  9. 算法导论学习笔记 6.5 优先队列
  10. GUI实战|Python做一个文档图片提取软件