HashMap和Hashtable的同和不同
一.综述
可以直接根据hashcode值判断两个对象是否相等吗?肯定是不可以的,因为不同的对象可能会生成相同的hashcode值。虽然不能根据hashcode值判断两个对象是否相等,但是可以直接根据hashcode值判断两个对象不等,如果两个对象的hashcode值不等,则必定是两个不同的对象。如果要判断两个对象是否真正相等,必须通过equals方法。
也就是说对于两个对象,如果调用equals方法得到的结果为true,则两个对象的hashcode值必定相等;如果equals方法得到的结果为false,则两个对象的hashcode值不一定不同;如果两个对象的hashcode值不等,则equals方法得到的结果必定为false;如果两个对象的hashcode值相等,则equals方法得到的结果未知。
HashMap和Hashtable不保证map的顺序,也不保证顺序不会随着时间不变。
HashMap实例有两个参数影响性能:初始capacity和load factor。capacity是hashtable中桶的数量,初始capacity就是hashtable创建时的capacity。load factor影响hashtable多满时允许自动增加capacity。当hashtable中entry的数量超过load factor和当前capacity的乘积,hashtable会重新哈希(意味着,内部数据结构重建)因此hashtable大约拥有桶数量的两倍。
作为通用规则,默认load factor(0.75)在时间和空间消耗上提供了好的权衡。值越大,空间开销越小,但是遍历成本增加(表现在大多数操作,包括get和put)。当设置初始capacity时,为了最小化重新hash的操作次数,应该考虑map的entry数量和load factor。如果初始容量大于最大entry数量除以load factor,重新hash操作将不会发生。然而,设置初始capacity太大会浪费空间。
如果许多mapping存储在HashMap实例中,创建时使用足够大的capacity将允许mapping存储得更有效率,因为不会随着table的数量增大重新hash。注意使用许多相同hashCode()的key肯定会降低任意hashtable的性能。
二.相同点
DEFAULT_LOAD_FACTOR |
0.75 |
TREEIFY_THRESHOLD |
|
UNTREEIFY_THRESHOLD |
|
MIN_TREEIFY_CAPACITY 否则resize() |
|
size |
mapping数量 |
threhold |
capacity*load factor |
三.不同点
HashMap |
Hashtable |
|
线程安全 |
不安全 |
安全 |
允许null的键和值 |
允许 |
不允许 |
实现和继承 |
实现Map |
实现Map,继承Dictionary |
遍历方式 |
Iterator |
Iterator和Enumeration |
计算哈希值 |
(key == null) ? 0 : (h = key.hashCode()) ^ (h >>> 16) |
(key.hashCode() & 0x7FFFFFFF) |
计算数组下标 |
(length - 1) & hash |
hash % length |
DEFAULT_INITIAL_CAPACITY |
||
容量增加方式 |
old*2 的幂 |
old*2+1 |
构造函数 |
threshold=tableSizeFor(initialCapacity) |
threhold=initialCapacity*load factor |
resize |
从0-cap 链表顺序不变 |
从cap-0 链表顺序相反 |
计算数组下标:当length总是 2 的n次方时,h& (length-1)运算等价于对length取模,也就是h%length,但是&比%具有更高的效率。
容量增加方式:当数组长度为2的n次幂的时候,不同的key算得的index相同的几率较小,那么数据在数组上分布就比较均匀,也就是说碰撞的几率小。相对的,查询的时候就不用遍历某个位置上的链表,这样查询效率也就较高了。导致resize()不同HashMap直接使用之前的数组下表,而Hashtable需要重新计算。
HashMap和Hashtable的同和不同的更多相关文章
- Java集合专题总结(1):HashMap 和 HashTable 源码学习和面试总结
2017年的秋招彻底结束了,感觉Java上面的最常见的集合相关的问题就是hash--系列和一些常用并发集合和队列,堆等结合算法一起考察,不完全统计,本人经历:先后百度.唯品会.58同城.新浪微博.趣分 ...
- java面试题——HashMap和Hashtable 的区别
一.HashMap 和Hashtable 的区别 我们先看2个类的定义 public class Hashtable extends Dictionary implements Map, Clonea ...
- Map集合及与Collection的区别、HashMap和HashTable的区别、Collections、
特点:将键映射到值的对象,一个映射不能包含重复的键,每个键最多只能映射到一个值. Map集合和Collection集合的区别 Map集合:成对出现 (情侣) ...
- HashMap和 Hashtable的比较
Hashtable 和 HashMap的比较 1. HashMap可以接受null(HashMap可以接受为null的键值(key)和值(value), HashTable不可以接受为null的键( ...
- hashMap和hashTable的区别
每日总结,每天进步一点点 hashMap和hashTable的区别 1.父类:hashMap=>AbstractMap hashTable=>Dictionary 2.性能:hashMap ...
- HashMap和HashTable到底哪不同?
HashMap和HashTable有什么不同?在面试和被面试的过程中,我问过也被问过这个问题,也见过了不少回答,今天决定写一写自己心目中的理想答案. 代码版本 JDK每一版本都在改进.本文讨论的Has ...
- java分享第七天-01(Hashmap和Hashtable的区别&Property)
一.Hashmap和Hashtable的区别 1 主要:Hashtable线程安全,同步,效率相对低下 HashMap线程不安全,非同步,效率相对高 2 父类:Hashtable是Dictionary ...
- HashMap底层实现原理/HashMap与HashTable区别/HashMap与HashSet区别
①HashMap的工作原理 HashMap基于hashing原理,我们通过put()和get()方法储存和获取对象.当我们将键值对传递给put()方法时,它调用键对象的hashCode()方法来计算h ...
- HashMap、HashTable、LinkedHashMap和TreeMap用法和区别
Java为数据结构中的映射定义了一个接口java.util.Map,它有四个实现类,分别是HashMap.HashTable.LinkedHashMap和TreeMap.本节实例主要介绍这4中实例的用 ...
- Java重点之小白解析--浅谈HashMap与HashTable
这是一个面试经常遇到的知识点,无论什么公司这个知识点几乎是考小白必备,为什么呢?因为这玩意儿太特么常见了,常见到你写一百行代码,都能用到好几次,不问这个问哪个.so!本小白网罗天下HashMap与Ha ...
随机推荐
- DotNET应用架构设计指南 安全 运行管理和通讯策略
DotNET应用架构设计指南(第三章:安全 运行管理和通讯策略(13-16)) 安全 运行管理和通讯策略 组织策略定义的规则是支配应用程序如何安全,如何管理,不同的应用程序组件是如何和另一组件及外部服 ...
- Blend4开发:会飞的小鸟
1,绘图,动画制作: 2,运行截图: 源码:http://files.cnblogs.com/yuanli/Animals.zip 动画效果参见源码.
- JAVA学习:内部类
一.内部类的访问规则: 1.内部类可以直接访问外部类中的成员,包括私有.格式为外部类名.this 2.外部类要访问内部类,必须建立内部类对象. 代码: class Outer { private in ...
- Love myself...
Sometimes we feel as if our lives rely on that one person. We think 'If I do this, he/she will like ...
- MVC视图中的@Html.xxx(...)
ASP.NET MVC视图中的@Html.xxx(...) 问题 在视图页中@Html.xxx(...)是什么?如何被执行? 如下图所示: 解疑 视图页中@Html.xxx(...)涉及的内容有: ...
- linux下的中文编码问题
很多linux的初学者都会碰到这样一个问题:把windows下的文档拷到linux系统,会出现乱码!其实这涉及到中文编码的问题.linux系统默认的是统一码(utf8).而如果你的文件是big5,显然 ...
- c# 数据类型占用的字节数
最近一直在使用C#中的关于各种数据类型转化为字节或者字节转化为各种数据类型进行数据解析.但是在此之前必须知道各种数据类型在字节中占的字节数. 所以在此归总. bool -> System.Boo ...
- memcpy的实现
memcpy的实现看起来貌似比较简单,但是也是有注意的地方! void *memcpy(void *dst, const void *src, size_t size) { //check argum ...
- 初探performance.timing API
初探performance.timing API 浏览器新提供的performance接口精确的告诉我们当访问一个网站页面时当前网页每个处理阶段的精确时间(timestamp),以方便我们进行前端 ...
- Android 屏幕截图(底层实现方式)
加载底层库ScreenCap.java: public class ScreenCap { static { System.loadLibrary("scrcap"); } sta ...