前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >HashSet和HashMap的区别 && HashTable和HashMap的区别

HashSet和HashMap的区别 && HashTable和HashMap的区别

作者头像
week
发布2018-08-27 10:05:15
9530
发布2018-08-27 10:05:15
举报
文章被收录于专栏:用户画像用户画像

一、HashMap 与 HashSet的区别

HashMap

HashSet

HashMap实现了Map接口

HashSet实现了Set接口

HashMap存储键值对

HashSet仅仅存储对象

使用put()方法将元素放入map中

使用add()方法将元素放入set中

HashMap使用键对象来计算hashcode值

HashSet使用成员对象来计算hashcode值, 对于两个对象来说hashcode可能相同,所以 equals()方法来判断对象的相等性

HashMap比较快,因为是使用唯一的键来获取对象

HashSet较HashMap来说比较慢

二、HashMap 与 HashTable 的区别

1. 继承不同

HashTable继承自字典类,HashMap继承自AbstractMap

代码语言:javascript
复制
public class Hashtable extends Dictionary<> implements Map<>
public class HashMap  extends AbstractMap<> implements Map<>

2.Hashtable 中的方法是同步的,而HashMap中的方法在缺省情况下是非同步的。

在多线程并发的环境下,可以直接使用Hashtable,但是要使用HashMap的话就要自己增加同步处理了

3.HashTable中,key和value都不允许出现null值

在HashMap中,null可以作为键,这样的键只有一个;可以有一个或多个键所对应的值为null。当get()方法返回null值时,即可以表示 HashMap中没有该键,也可以表示该键所对应的值为null。因此,在HashMap中不能由get()方法来判断HashMap中是否存在某个键, 而应该用containsKey()方法来判断。

4.两个遍历方式的内部实现上不同

HashTable、HashMap都使用了 Iterator。而由于历史原因,HashTable还使用了Enumeration的方式 。

5.哈希值的使用不同

HashTable直接使用对象的hashCode,如下:

代码语言:javascript
复制
int hash = key.hashCode();
int index = (hash & 0x7FFFFFFF) % tab.length;

而HashMap重新计算hash值,而且用"与运算"代替“求模”:

代码语言:javascript
复制
int hash = hash(k);
int i = indexFor(hash, table.length);
 
static int hash(Object x) {
   int h = x.hashCode();
   h += ~(h << 9);
   h ^= (h >>> 14);
   h += (h << 4);
   h ^= (h >>> 10);
   return h;
}
static int indexFor(int h, int length) {
   return h & (length-1);
}

6.初始化和扩容

Hashtable和HashMap它们两个内部实现方式的数组的初始大小和扩容的方式。

代码语言:javascript
复制
 HashTable中hash数组默认大小是11,增加的方式是 old*2+1。

HashMap中hash数组的默认大小是16,而且一定是2的指数。

本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2015年01月23日,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档