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

一、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

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,如下:

int hash = key.hashCode();
int index = (hash & 0x7FFFFFFF) % tab.length;

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

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它们两个内部实现方式的数组的初始大小和扩容的方式。

 HashTable中hash数组默认大小是11,增加的方式是 old*2+1。

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

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏闵开慧

HashMap与HashTable区别

1 HashMap不是线程安全的 hastmap是一个接口 是map接口的子接口,是将键映射到值的对象,其中键和值都是对象,并且不能包含重复键,但可以包含重复...

2646
来自专栏Java帮帮-微信公众号-技术文章全总结

Java集合详解【面试+工作】

在说集合前我们不得不说一下数组 数组的作用: 存放一组相同的数据类型(基本或对象)的数据,从而实现对数据的管理 优势:可以快速的通过下标对数组元素进行访问,效率...

4356
来自专栏云霄雨霁

字符串查找----R向单词查找树

1050
来自专栏Java 源码分析

HashSet 源码分析

HashSet 源码分析 1. 在阅读源码时做了大量的注释,并且做了一些测试分析源码内的执行流程,由于博客篇幅有限,并且代码阅读起来没有 IDE 方便,所以在...

3164
来自专栏Java进阶之路

java面试热点:集合框架(二)

1900
来自专栏吾爱乐享

#集合笔记二#list集合特有功能及案例迭代

1755
来自专栏恰同学骚年

剑指Offer面试题:12.在O(1)时间删除链表结点

  在单向链表中删除一个结点,最常规的做法无疑是从链表的头结点开始,顺序遍历查找要删除的结点,并在链表中删除该结点。这种思路由于需要顺序查找,时间复杂度自然就是...

691
来自专栏编程心路

在ArrayList的循环中删除元素,会不会出现问题?

在 ArrayList 的循环中删除元素,会不会出现问题?我开始觉得应该会有什么问题吧,但是不知道问题会在哪里。在经历了一番测试和查阅之后,发现这个“小”问题并...

3982
来自专栏desperate633

LintCode 子数组之和题目分析代码

给定一个整数数组,找到和为零的子数组。你的代码应该返回满足要求的子数组的起始位置和结束位置

622
来自专栏java一日一条

集合类操作优化经验总结

在实际的项目开发中会有很多的对象,如何高效、方便地管理对象,成为影响程序性能与可维护性的重要环节。Java 提供了集合框架来解决此类问题,线性表、链表、哈希表等...

812

扫码关注云+社区