Hashtable,HashMap,HashSet异同(转)

原文:

 

作者:张超帅
来源:CSDN
原文:https://blog.csdn.net/weixin_38070406/article/details/74936705

Hashtable

Hashtable散列表,通过键-值对应的形式存储元素,是一种无序的数据结构。
类的定义:

public class Hashtable
    extends Dictionary
    implements Map, Cloneable,io.Serializable



构造函数如下

Hashtable():构造一个空的散列表,初始容量为11.负载因子为0.75.
Hashtable(int initalCapacity,float loadFactor):指定初始化容量和负载因子,构造一个散列表。
Hashtable(Map t):根据映像所包含的元素,构建一个散列表。



散列表(Hashtable)的主要方法如下:

object put(object key,object value):put方法是向一个散列表中添加元素,在散列表中根据所添加的键值来定位元素,这个键值是唯一的,针对这个方法,要记住这个键值是对象型数据。
boolean containsKey(object key)和boolean containvalue(object value):这两个方法是测试散列表中是否包含指定的键值和值。
Object remove(object key):根据指定的键值从散列表中删除对应键的元素。
Colletion values():返回散列表中所包含元素的集合,是元素的集合,而不是key的集合。


在散列表中不允许有两个相同的元素,如有相同的元素,程序会将其作为一个元素来处理。
Hashtable的put方法:

方法是同步的 ( Synchronized)
方法不允许value==null
方法调用了key的hashCode方法,如果key==null,会抛出空指针异常



HashMap

类的定义

public class HashMap
    extends AbstractMap
    implements Map, Cloneable, Serializable

可见Hashtable 继承自 Dictionary 而 HashMap 继承自 AbstractMap
HashMap的put方法:

方法是非同步的
方法允许key==null
方法并没有对value进行任何调用,所以允许为null

HashMap 是 Hashtable 的轻量级实现(非线程安全的实现),他们都完成了Map接口,
主要区别在于HashMap允许空(null)键值(key),由于非线程安全,效率上可能高于Hashtable。

最大的不同是,Hashtable的方法是Synchronize的,而HashMap不是,在多个线程访问Hashtable时,不需要自己为它的方法实现同步,而HashMap 就必须为之提供外同步(Collections.synchronizedMap)。

Hashtable 和  HashMap 采用的 hash/rehash 算法都大概一样,所以性能不会有很大的差异。

 

HashSet

HashSet(散列集)和散列表(hashtable)这两种数据结构,功能基本相同,不过他们实现的接口不一样。散列表实现的是Map(映像)接口,而散列集(HashSet)实现了Set接口。另外散列表是线性同步,而散列集是非线性同步的。

HashSet 既然实现了Set接口,也就实现了Collection接口,所以它是一个集合,仍然是add方法添加元素。
散列集(HashSet)的构造函数如下

HashSet():创建一个空的散列集对象。
HashSet(collection c):创建一个包含有collection集合中所有元素的散列集对象。
HashSet(int initialCapacity):创建一个包含有collection集合中所有元素的散列集对象。
HashSet(int initialCapacity,float loadFactor):指定初始化容量和负载因子,构造一个散列表。它的初始化容量为16,负载因子为0.75.


散列集(HashSet)的常用方法如下:

boolean add(obj):添加一个元素到散列集中。如果这个元素中在散列集中不存在,就直接添加它,否则就返回false.
boolean remove(obj):删除一个元素,如果这个元素存在,就删了它,否则就返回false.
boolean isempty():判断集合是否为空。


散列集可以采用迭代器进行遍历,散列集合散列表一样,都不能拥有相同的元素。

散列集通过内部散列码计算元素存储地址,这一点与散列表一样,只不过散列集没有键值。

使用散列集进行数据处理,比使用链表进行数据处理花费的时间更短,这样可以节约系统资源。
--------------------- 

posted @ 2019-05-01 16:50  allenbackpacker  阅读(349)  评论(0编辑  收藏  举报