码迷,mamicode.com
首页 > 其他好文 > 详细

HashMap与HashTable、HashSet与HashMap异同

时间:2014-10-29 12:25:06      阅读:156      评论:0      收藏:0      [点我收藏+]

标签:style   blog   http   io   os   ar   使用   java   for   

1、 HashMap与HashTable的区别:

(1)HashMap允许将null作为一个entry的key或者value,而Hashtable不允许。当get()方法返回null值时,即可以表示HashMap中没有该键,也可以表示该键所对应的值为null。因此,在HashMap中不能由get()方法来判断HashMap中是否存在某个键,而应该用containsKey()方法来判断。

(2)HashMap把Hashtable的contains方法去掉了,改成containsvalue和containsKey。因为contains方法容易让人引起误解。 

(3)Hashtable继承自Dictionary类,而HashMap是Java1.2引进的Map interface的一个实现。

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

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

(6)HashTable使用Enumeration,HashMap使用Iterator。

(7)HashTable中hash数组默认大小是11,增加的方式是 old*2+1。HashMap中hash数组的默认大小是16,而且一定是2的指数。

(8)哈希值的使用不同,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);
 }

 

2 map 的方法:

clear()从 Map 中删除所有映射

remove(Object key)从 Map 中删除键和关联的值

put(Object key, Object value)将指定值与指定键相关联 

get(Object key)返回与指定键关联的值

containsKey(Object key)如果 Map 包含指定键的映射,则返回 true 

containsValue(Object value)如果此 Map 将一个或多个键映射到指定值,则返回 true

isEmpty()如果 Map 不包含键-值映射,则返回 true size()返回 Map 中的键-值映射的数目

 

3 HashSet和HashMap的区别

什么是HashSet?

HashSet实现了Set接口,它不允许集合中有重复的值,当我们提到HashSet时,第一件事情就是在将对象存储在HashSet之前,要先确保对象重写equals()和hashCode()方法,这样才能比较对象的值是否相等,以确保set中没有储存相等的对象。如果我们没有重写这两个方法,将会使用这个方法的默认实现。详见《探索equals()和hashCode()方法》。

public boolean add(Object o)方法用来在Set中添加元素,当元素值重复时则会立即返回false,如果成功添加的话会返回true。

什么是HashMap?

HashMap实现了Map接口,Map接口对键值对进行映射。Map中不允许重复的键。Map接口有两个基本的实现,HashMap和TreeMap。TreeMap保存了对象的排列次序,而HashMap则不能。HashMap允许键和值为null。HashMap是非synchronized的,但collection框架提供方法能保证HashMap synchronized,这样多个线程同时访问HashMap时,能保证只有一个线程更改Map。

public Object put(Object Key,Object value)方法用来将元素添加到map中。

HashSet和HashMap的区别

*HashMap* *HashSet*
HashMap实现了Map接口 HashSet实现了Set接口
HashMap储存键值对 HashSet仅仅存储对象(且无重复对象)
使用put()方法将元素放入map中 使用add()方法将元素放入set中
HashMap中使用键对象来计算hashcode值 HashSet使用成员对象来计算hashcode值,对于两个对象来说hashcode可能相同,所以equals()方法用来判断对象的相等性,如果两个对象不同的话,那么返回false
HashMap比较快,因为是使用唯一的键来获取对象 HashSet较HashMap来说比较慢

 

HashMap与HashTable、HashSet与HashMap异同

标签:style   blog   http   io   os   ar   使用   java   for   

原文地址:http://www.cnblogs.com/whoiszoe/p/4059109.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!