首先,我们要知道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的位置,于是,

     static int hash(int h) {
// This function ensures that hashCodes that differ only by
// constant multiples at each bit position have a bounded
// number of collisions (approximately 8 at default load factor).
h ^= (h >>> 20) ^ (h >>> 12);
return h ^ (h >>> 7) ^ (h >>> 4);
}

我们看到了,这个复杂的代码,它的意思就是我刚才说的,通过移位和异或让更多的位决定key的位置,这样会减少冲突,更均匀。

但是hashtable,虽说是线程安全的,但是他是jdk1.0引入的很老,它的hash函数很普通,

int index = (hash & 0x7FFFFFFF) % tab.length; //hash就是key的hashcode,然后获得非符号位(hashcode为 int,可能为负,所以去掉符号位);

对于线程安全,以后再仔细说。

http://zhangshixi.iteye.com/blog/672697

               

Hash(4) hashtable,hashmap的更多相关文章

  1. Hashtable,HashMap实现原理

    http://blog.csdn.net/czh0766/article/details/5260360 昨天看了算法导论对散列表的介绍,今天看了一下Hashtable, HashMap这两个类的源代 ...

  2. HashTable & HashMap & ConcurrentHashMap 原理与区别

    一.三者的区别     HashTable HashMap ConcurrentHashMap 底层数据结构 数组+链表 数组+链表 数组+链表 key可为空 否 是 否 value可为空 否 是 否 ...

  3. Hashtable,HashMap,TreeMap有什么区别?Vector,ArrayList,LinkedList有什么区别?int和Integer有什么区别?

    接着上篇继续更新. /*请尊重作者劳动成果,转载请标明原文链接:*/ /*https://www.cnblogs.com/jpcflyer/p/10759447.html* / 题目一:Hashtab ...

  4. Vector & ArrayList Hashtable & HashMap ArrayList & LinkedList

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

  5. Java 总结 数据底层原理 【包括 ArrayList、LinkedList、hash table、HashMap、Hashtable、ConcurrentHashMap、hash code、HashSet、LinkedHashMap、LinkedHashSet】

    1.ArrayList (1)底层是由动态数组实现的[使用了List接口]. (2)动态数组是长度不固定,随着数据的增多而变长. (3)如果不指定,默认长度为10,当添加的元素超过当前数组的长度时,会 ...

  6. HashSet HashTable HashMap的区别 及其Java集合介绍

    (1)HashSet是set的一个实现类,hashMap是Map的一个实现类,同时hashMap是hashTable的替代品(为什么后面会讲到). (2)HashSet以对象作为元素,而HashMap ...

  7. HashSet HashTable HashMap的区别

    (1)HashSet是set的一个实现类,hashMap是Map的一个实现类,同时hashMap是hashTable的替代品(为什么后面会讲到). (2)HashSet以对象作为元素,而HashMap ...

  8. Hashtable HashMap

    Hashtable和HashMap类有三个重要的不同之处.第一个不同主要是历史原因.Hashtable是基于陈旧的Dictionary类的,HashMap是Java 1.2引进的Map接口的一个实现. ...

  9. java该HashTable,HashMap和HashSet

    同一时候我们也对HashSet和HashMap的核心方法hashcode进行了具体解释,见<探索equals()和hashCode()方法>. 万事俱备,那么以下我们就对基于hash算法的 ...

随机推荐

  1. android studio或者IntelliJ代码样式的设置

    使用过程中发现了一些与Eclipse不同的地方,在这里提供一些设置方法   1. Backspace会将开头的空格和换行符一并删除,如果要禁用 Settings -> Editor -> ...

  2. ACM HDU 1021 Fibonacci Again

    #include<iostream> using namespace std; int main() { int n; while(cin>>n) { if((n+1)%4== ...

  3. 图解数据结构树之AVL树

    AVL树(平衡二叉树): AVL树本质上是一颗二叉查找树,但是它又具有以下特点:它是一棵空树或它的左右两个子树的高度差的绝对值不超过1,并且左右两个子树都是一棵平衡二叉树.在AVL树中任何节点的两个子 ...

  4. shell命令:echo命令详解

    功能说明:显示文字. 语 法:echo [-ne][字符串] / echo [--help][--version] 补充说明:echo会将输入的字符串送往标准输出.输出的字符串间以空白字符隔开, 并在 ...

  5. Pintos-斯坦福大学操作系统Project详解-Project1

    转载请注明出处. 前言:  本实验来自斯坦福大学cs140课程,只限于教学用途,以下是他们对于Pintos系统的介绍:  Pintos is a simple operating system fra ...

  6. jquery data方法取值与js attr取值的区别

    <a data-v="3"></a> jquery data方法的运行机制: 第一次查找dom,使用attributes获取到dom节点值,并将其值存到缓存 ...

  7. 配置并学习微信JS-SDK(2)—图片接口

    测试地址:http://www.qq210.com/shoutu/android 检查图像接口 选择本地或拍照的图片 上传选择的图片 预览上传的图片 //1.检查图像接口 document.query ...

  8. excel快递单号查询工具以及源码

    Function kdcx(kd, orderid) Dim Err, url, kdtime, link, Errcode, Status Select Case kd '此处支持的快递公司很多的 ...

  9. apache日志文件 accesslog

    因为想要看到apache的日志记录用户请求某个页面所花的时间,需要添加额外参数才会记录,所以临时查了下哦..记下来了 在httpd.conf里可以看到一行这样的配置 LogFormat "% ...

  10. 【算法】改进的冒泡排序 O(n^2) 稳定的 C语言

    改进的冒泡排序 一.算法描述 基于原冒泡排序 每次选取第一个元素作为主元往后进行比较,若遇到比它小的则放到它左边(即进行交换),若遇到比它大的则选取大的作为主元进行后续比较,每趟选取了无序列中最大元素 ...