技术标签: hashMap 和 HashTable
hashMap 和 HashTable
1.两者最主要的区别在于Hashtable是线程安全,而HashMap则非线程安全
Hashtable的实现方法里面都添加了synchronized关键字来确保线程同步,因此相对而言HashMap性能会高一些,我们平时使用时若无特殊需求建议使用HashMap,在多线程环境下若使用HashMap需要使用Collections.synchronizedMap()方法来获取一个线程安全的集合
2.HashMap可以使用null作为key,而Hashtable则不允许null作为key
虽说HashMap支持null值作为key,不过建议还是尽量避免这样使用,因为一旦不小心使用了,若因此引发一些问题,排查起来很是费事
HashMap以null作为key时,总是存储在table数组的第一个节点上
3.HashMap是对Map接口的实现,HashTable实现了Map接口和Dictionary抽象类
4.HashMap的初始容量为16,Hashtable初始容量为11,两者的填充因子默认都是0.75
HashMap扩容时是当前容量翻倍即:capacity2,Hashtable扩容时是容量翻倍+1即:capacity2+1
5 两者计算hash的方法不同
Hashtable计算hash是直接使用key的hashcode对table数组的长度直接进行取模
int hash = key.hashCode();
int index = (hash & 0x7FFFFFFF) % tab.length;
HashMap计算hash对key的hashcode进行了二次hash,以获得更好的散列值,然后对table数组长度取摸
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);
}
static int indexFor(int h, int length) {
return h & (length-1);
}
6 HashMap和Hashtable的底层实现都是数组+链表结构实现
首先Hashtable是jdk1.0版本加入的,命名规则上有点冲突 HashMap和Hashtable的区别 一:线程安全 Hashtable 是线程安全的,HashMap 不是线程安全的。 为什么说 HashTable 是线程安全的? 来看下 Hashtable 的源码,Hashtable 所有的元素操作如put-get等都是 synchronized 修饰的,而 HashMap 并没有 二:性...
相同: 都保存映射关系数据,即键值对。 HashTable 键值对结构: HashMap 键值对结构: 保存键值对的数据都继承于 Map.Entry<K,V>接口 都使用拉链法扩展 不同: HashMap 中 null 可以作为 key,并且会计算散列码,HashTable 中 null 不能作为 key HashMap中(1.8之后)桶中元素达到阀值会转为树来存放。 HashMap ...
HashMap和HashTable的区别 线程是否安全 实现方式 key值是否可为null 存储的位置 底层实现 一、线程安全性 两者的最主要的区别就是体现在线程的安全性上。 HashMap是线程不安全的,HashTable是线程安全的,因为HashTable的实现方法里都添加了synchronized关键字来确保线程同步。所以HashMap的运行效率要高一些。平时如果无特殊需求建议使用HashM...
区别 1、线程区别 首先看HashMap的源码在添加时的处理 其次看Hashtable的源码在添加时的处理 后者在操作时添加了synchronized保证了线程安全,Hashtable数据操作的时候都会上锁,所以效率比较低下。 2、为什么HashMap可以添加空key,而Hashtable不行呢? HashMap在添加空key的时候做了特殊处理,如果key的null的话就等于0 Hashtable...
关于HashMap你需要了解的: 相关面试题 1. 下面有关java hashmap的说法错误的是?( ) 2. 关于HashMap与HashTable,以下说法错误的是 ( ) 3. 有关hashMap跟hashTable的区别,说法正确的是?( ) 4. HashMap和HashTable的描述,错误的是? 5. 在Java中,关于HashMap类的描述,以下错误的是()? 支持我的话可以关注...
Hashtable和HashMap比较 标签: java8源码 欢迎 start 由于 Hashtable 不建议使用. 用到 Hashtable 的地方 应该用 ConcurrentHashMap 来代替,所以下面仅介绍 Hashtable 的特性和与HashMap 的 区别. 相同点: 不同点: 不同点 HashMap Hashtable 数据结构 数组+链表+红黑树 数组+链表 继承的类不同...
HashTable源码 HashTable源码定义 这个类实现了一个哈希表,它将键映射到值。任何非空对象都可以用作键或值。 HashMap源码 HashMap源码定义 基于哈希表的映射接口实现。该实现提供了所有可选的映射操作,并允许null值和null键。(HashMap类大致相当于Hashtable,除了它是不同步的,并且允许null) 注:java中两种数据存储方式: 数组 查询速度快,增删较...
1、继承 2、HashTable是线程同步的,HashMap则不是 3、HashTable中的key和value都不允许为null,HashMap允许有一个key为null,多个value为null 4、两者遍历方式内部实现不同,两者都用了迭代器Iterator,由于历史原因,HashTable还是用了枚举Enumeration的方式 5、HashTable直接使用HashCode,而HashMa...
关于这个问题真的是老生常谈,面试题基本上必考,那么就来通过源码理解下两者的异同。 HashMap HashTable HashTable如何实现线程安全呢? 让大家失望了,HashTable源码中找不到带有“Thread”的线程,它只是将每个方法声明成了synchronized 来保证线程同步,个人觉得HashTable=HashMap+synchronized 。 最核心...
题目描述 小明开了一家糖果店。他别出心裁:把水果糖包成4颗一包和7颗一包的两种。糖果不能拆包卖。 小朋友来买糖的时候,他就用这两种包装来组合。当然有些糖果数目是无法组合出来的,比如要买 10 颗糖。 你可以用计算机测试一下,在这种包装情况下,最大不能买到的数量是17。大于17的任何数字都可以用4和7组合出来。 本题的要求就是在已知两个包装的数量时,求最大不能组合出的数字。 输入 两个正整数,表示每...