hashtable和hashmap小结
来源:互联网 发布:狂人日记读后感知乎 编辑:程序博客网 时间:2024/05/29 23:22
Hashmap和hashtable
一、 HashMap简介
1、 hashmap的特点:
1、 HashMap基于哈希表实现,内部通过单链表解决冲突。
2、 HashMap是非线程安全的,只适用于单线程环境下,多线程环境下可以采用concurrent并发包下的concurrentHashMap。
3、 HashMap 实现了Serializable接口,支持序列化。
4、实现了Cloneable接口,能被克隆。
5、 HashMap中key和value都允许为null。
2、HashMap的原理:
1、HashMap内部有一个存储数据的数组,每一个数组单元中存放的是一个是一个单向链表。
2、当存入一个key/value数据时,先通过哈希算法计算出哈希值,然后根据定义的算法计算出存放的位置,然后将数据放入制定的位置。(算法:哈希值与0x7FFFFFFF进行与运算,然后对数组的长度进行取余)
3、 尽管进行了复杂的位置计算,但是还是有可能发生位置冲突问题,HashMap采用链地址法解决冲突,每一个数组单元中保存了一个链表,如果计算的位置冲突,则增加链表的长度,问题迎刃而解。
4、 key为null的键值对链表的头部
3、 扩容机制
在这里不做详解
二、Hashtable简介
1、Hashtable的特点:
1、基于哈希表实现的
2、是线程安全的,能用于多线程环境中。
3、Hashtable同样实现了Serializable接口,支持序列化,
4、实现了Cloneable接口,能被克隆。
2、原理
和hashmap的原理相同
三、HashTable和HashMap区别
1、继承的父类不同: Hashtable继承自Dictionary类,而HashMap继承自AbstractMap类。但二者都实现了Map接口。
2、线程安全性不同:Hashtable中的方法是Synchronize的,线程安全,而HashMap中的方法在缺省情况下是非Synchronize的。在多线程并发的环境下,可以直接使用Hashtable,但使用HashMap时就必须要自己增加同步处理。Hashtable是线程安全,因为它每个方法中都加入了Synchronize。HashMap底层是散列表,当发生hash冲突的时候,hashmap是采用链地址法的方式来解决的,在对应的数组位置存放链表的头结点。对链表而言,新加入的节点会从头结点加入。
就是说如果两个线程添加数值,恰巧计算的位置在同一处,这样当添加数据时,后一个就会把前一个数据覆盖掉,造成错误。不只是添加,删除也会发生错误。
3、是否提供contains方法
HashMap把Hashtable的contains方法去掉了,改成containsValue和containsKey,因为contains方法容易让人引起误解。 Hashtable则保留了contains,containsValue和containsKey三个方法,其中contains和containsValue功能相同。
4、key和value是否允许null值
通过源码的ContainsKey方法和ContainsValue的源码: Hashtable中,key和value都不允许出现null值。但是如果在Hashtable中有类似put(null,null)的操作,编译同样可以通过,因为key和value都是Object类型,但运行时会抛出NullPointerException异常,这是JDK的规范规定的。HashMap中,null可以作为键,这样的键只有一个;可以有一个或多个键所对应的值为null。当get()方法返回null值时,可能是 HashMap中没有该键,也可能使该键所对应的值为null。因此,在HashMap中不能由get()方法来判断HashMap中是否存在某个键,而应该用containsKey()方法来判断。
5、两个遍历方式的内部实现上不同
Hashtable、HashMap都使用了 Iterator。而由于历史原因,Hashtable还使用了Enumeration(枚举)的方式。
6、hash值不同
哈希值的使用不同,HashTable直接使用对象的hashCode。而HashMap重新计算hash值。hashCode是根据对象的地址或者字符串或者数字算出来的int类型的数值。 Hashtable计算hash值,直接用key的hashCode(),而HashMap重新计算了key的hash值,Hashtable在求hash值对应的位置索引时,用取模运算,而HashMap在求位置索引时,则用与运算,且这里一般先用hash&0x7FFFFFFF后,再对length取模,&0x7FFFFFFF的目的是为了将负的hash值转化为正值,因为hash值有可能为负数,而&0x7FFFFFFF后,只有符号外改变,而后面的位都不变。
7、内部实现使用的数组初始化和扩容方式不同
HashTable在不指定容量的情况下的默认容量为11,而HashMap为16,Hashtable不要求底层数组的容量一定要为2的整数次幂,而HashMap则要求一定为2的整数次幂。 Hashtable扩容时,将容量变为原来的2倍加1,而HashMap扩容时,将容量变为原来的2倍。
- hashtable和hashmap小结
- Hashtable和HashMap区别小结
- hashMap和hashtable方面的知识点小结
- Hashtable和HashMap对象
- HashMap和Hashtable区别
- Hashtable和HashMap类
- Hashtable和HashMap
- Hashtable和HashMap
- Hashtable和HashMap
- hashMap和HashTable
- HashMap 和 HashTable
- Java Hashmap 和 Hashtable
- hashtable 和hashmap比较
- HashSet 、HashMap 和 HashTable
- hashtable和hashmap区别
- HashMap和Hashtable
- HashMap和HashTable
- hashtable和hashmap比较
- 330. Patching Array (贪心)
- codeforces822c+codeforces612d
- Java基础之接口到底是啥
- mysql开发技巧1
- static静态处理笔记----C++学习之路
- hashtable和hashmap小结
- 宇宙真正的吸引力法则
- Algorithm 4th 1.1 基础编程模型
- Java配置环境变量
- Java设计模式概述
- 素数测试随机算法
- 汇编语言
- opencv学习——常见滤波器形状
- 总结php面试常考问题