首先,我们要知道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. IIS7报错:如果要使用托管的处理程序,请安装 ASP.NET

    转载至码农SeraphWU IIS7报错:如果要使用托管的处理程序,请安装 ASP.NET 进入CMD 输入如下命令即可 "%WINDIR%\Microsoft.NET\Framework\ ...

  2. SQL Execute语法.

    一,执行字符串: EXECUTE语句可以执行存放SQL语句的字符串变量,或直接执行SQL语句字符串. 语法:EXECUTE({@字符串变量|[N]’SQL语句字符串’}[+...n]) 例子:Decl ...

  3. asp.net服务器控件开发系列一

    最近想写写博客记录下自己学习开发服务器控件. 第一步:搭建环境. 1.新建一个项目类库,用于保存控件: 2.新建一个Web工程,用于调用控件: 如图: 第二步:在控件类库下,新建一个服务器控件类Tex ...

  4. 线程池ThreadPoolExecutor使用简介

    一.简介 线程池类为 java.util.concurrent.ThreadPoolExecutor,常用构造方法为: ThreadPoolExecutor(int corePoolSize, int ...

  5. BearSkill实用方法之UITextField限制输入的字符数量

    原文:http://blog.csdn.net/xiongbaoxr/article/details/51525061      

  6. hdu 1788 Chinese remainder theorem again(最小公倍数)

    Problem Description 我知道部分同学最近在看中国剩余定理,就这个定理本身,还是比较简单的: 假设m1,m2,-,mk两两互素,则下面同余方程组: x≡a1(mod m1) x≡a2( ...

  7. ERP系统开发平台 (C#语言,支持多数据库)

    C/S系统开发框架-企业版 V4.0 (Enterprise Edition) 简介: http://www.csframework.com/cs-framework-4.0.htm 适用软件:适合开 ...

  8. max os 安装python模块PIL

    下载libjpeg和zlib: http://www.ijg.org/files/jpegsrc.v9.tar.gz http://zlib.net/zlib-1.2.8.tar.gz 安装libjp ...

  9. ASP.NET MVC轻教程 Step By Step 9——分页

    现在我们要把Index视图的留言信息进行分页显示. Step 1. 创建路由 我们希望以类似地址http://localhost:41583/Page1来表示第一页,Page2表示第二页,以此类推.在 ...

  10. java程序编译

    Empoyee.java package Company; public class Empoyee { String name = ""; public Empoyee(Stri ...