Java中hashmap和hashtable的区别

原创 2012年03月27日 21:24:55

Java中的Hashtables
   Java包含两个类,java.util.Hashtable 和java.util.HashMap,它们提供了一个多种用途的hashtable机制。这两个类很相似,通常提供相同的公有接口。但它们的确有一些重要的不同点,我在后面会讲到。 
Hashtable和HashMap对象可以让你把一个key和一个value结合起来,并用put() 方法把这对key/value输入到表中。然后你可以通过调用get()方法,把key作为参数来得到这个value(值)。只要满足两个基本的要求,key和value可以是任何对象。注意,因为key和value必须是对象,所以原始类型(primitive types)必须通过运用诸如Integer(int)的方法转换成对象。
   为了将一个特定类的对象用做一个key,这个类必须提供两个方法,equals() 和 hashCode()。这两个方法在java.lang.Object中,所以所有的类都可以继承这两个方法;但是,这两个方法在Object类中的实现一般没什么用,所以你通常需要自己重载这两个方法。Equals()方法把它的对象同另一个对象进行比较,如果这两个对象代表相同的信息,则返回true。该方法也查看并确保这两个对象属于相同的类。如果两个参照对象是完全一样的对象,Object.equals()返回true,这就说明了为什么这个方法通常不是很适合的原因。在大多数情况下,你需要一个方法来一个字段一个字段地进行比较,所以我们认为代表相同数据的不同对象是相等的。 
   HashCode()方法通过运用对象的内容执行一个哈希函数来生成一个int值。Hashtable和HashMap用这个值来算出一对key/value位于哪个bucket(哈希元)(或列表)中。作为例子,我们可以查看一下String 类,因为它有自己的方法来实现这两个方法。String.equals()对两个String对象一个字符一个字符地进行比较,如果字符串是相同的,则返回true:
String myName = "Einstein";
// The following test is 
// always true
if ( myName.equals("Einstein") )
{ ...
   String.hashCode()在一个字符串上运行哈希函数。字符串中每个字符的数字代码都乘以31,结果取决于字符串中字符的位置。然后将这些计算的结果相加,得到一个总数。这个过程似乎很复杂,但是它确保能够更好地分布值。它也证明了你在开发你自己的hashCode()方法时,能够走多远,确信结果是唯一的。
例如,假设我要用一个hashtable来实现一个书的目录,把书的ISBN号码作为搜索键来进行搜索。我可以用String类来承载细节,并准备好了equals()和hashCode()方法。我们可以用put()方法添加成对的key/value到hashtable中。

另外,在设计一个hashCode()方法时,应该记住一些规则。首先,该方法必须为一个特定的对象返回相同的值,而不管这个方法被调用了多少次(当然,只要对象的内容在调用之间没有改变,在将一个对象用做一个hashtable的key时,应该避免这一点)。第二,如果由你的equals()方法定义的两个对象是相等的,那么它们也必须生成相同的哈希码。第三,这更像是一个方针,而不是一个原则,你应该设法设计方法,使它为不同的对象内容生成不同的结果。如果偶尔不同的对象正好生成了相同的哈希码,这也不要紧。但是,如果该方法只能返回范围在1到10的值,那么只能用10个列表,而不管在hashtable中有多少个列表。
    在设计equals()和hashCode()时,另一个要记住的因素是性能问题。每次调用put()或get(),都包括调用hashCode()来查找正确的列表,当get()扫描列表来查找key时,它为列表中的每个元素调用equals()。实现这些方法使它们尽可能快而有效地运行,尤其当你打算使你的类公开可用时,因为其它的用户可能想在执行速度很重要的情况下,在高性能的应用程序中运用你的类。

    1、 继承和实现区别

  Hashtable是基于陈旧的Dictionary类,完成了Map接口;HashMap是Java 1.2引进的Map接口的一个实现(HashMap继承于AbstractMap,AbstractMap完成了Map接口)。

  2、 线程安全不同

  HashTable的方法是同步的,HashMap是未同步,所以在多线程场合要手动同步HashMap。

  3、 对null的处理不同

  HashTable不允许null值(key和value都不可以),HashMap允许null值(key和value都可以)。即 HashTable不允许null值其实在编译期不会有任何的不一样,会照样执行,只是在运行期的时候Hashtable中设置的话回出现空指针异常。 HashMap允许null值是指可以有一个或多个键所对应的值为null。当get()方法返回null值时,即可以表示 HashMap中没有该键,也可以表示该键所对应的值为null。因此,在HashMap中不能由get()方法来判断HashMap中是否存在某个键,而应该用containsKey()方法来判断。

  4、 方法不同

  HashTable有一个contains(Object value),功能和containsValue(Object value)功能一样。

  5、HashTable使用Enumeration,HashMap使用Iterator。

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

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

相关文章推荐

Java容器类List、ArrayList、Vector及map、HashTable、HashMap的区别与用法

有一部分是从 http://selives.blogbus.com/logs/27714366.html上面看到的,具体是哪些,时间长了,我也不记得了。 ArrayList 和Vecto...
  • funi16
  • funi16
  • 2012年08月10日 15:49
  • 395

Java笔记十二.常用API-Hashtable类及其与HashMap、HashSet的区别

常用API-Hashtable类及其与HashMap、HashSet的区别 一、Hashtable类 1.概述     Hashtable是一种高级数据结构,实现了一个Key-Value映射的哈...

java 容器类使用 Collection,Map,HashMap,hashTable,TreeMap,List,Vector,ArrayList的区别

java 容器类使用 Collection,Map,HashMap,hashTable,TreeMap,List,Vector,ArrayList的区别 经常会看到程序中使用了记录集,常用的...
  • J__King
  • J__King
  • 2014年09月23日 09:03
  • 810

Java容器类List、ArrayList、Vector及map、HashTable、HashMap分别的区别.

Java容器类List、ArrayList、Vector及map、HashTable、HashMap分别的区别. 一、List与ArrayList的区别 List->AbstractL...

Java中List,ArrayList、Vector,map,HashTable,HashMap区别用法

ArrayList 和Vector是采用数组方式存储数据,此数组元素数大于实际存储的数据以便增加和插入元素,都允许直接序号索引元素,但是插入数据要设计到数组元素移动 等内存操作,所以索引数据快插入数据...

Map接口的实现类--Hashtable和HashMap及TreeMap的区别--------(java复习)

1.Hashtable是Dictionary的子类,HashMap是Map接口的一个实现类; 2.Hashtable中的方法是同步的,而HashMap中的方法在缺省情况下是非同步的。即是说,在多线...

Java容器类List、ArrayList、Vector及map、HashTable、HashMap的区别与用法

本文转载自: http://selives.blogbus.com/logs/27714366.html ArrayList 和Vector是采用数组方式存储数据,此数组元素数大于实际存储的数据以便...

java中HashMap和Hashtable的区别

最近在巩固java基础的一些知识,

Java的HashMap和HashTable介绍与区别

Java的HashMap和HashTable 1. HashMap 1)  hashmap的数据结构       Hashmap是一个数组和链表的结合体(在数据结构称“链表散列“),如下图示: ...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:Java中hashmap和hashtable的区别
举报原因:
原因补充:

(最多只允许输入30个字)