欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

java面试题——详解HashMap和Hashtable 的区别

程序员文章站 2024-03-09 17:01:23
一.hashmap 和hashtable 的区别 我们先看2个类的定义 public class hashtable extends dictio...

一.hashmap 和hashtable 的区别

我们先看2个类的定义

 public class hashtable 
  extends dictionary 
  implements map, cloneable, java.io.serializable 
public class hashmap 
 extends abstractmap 
 implements map, cloneable, serializable 

可见hashtable 继承自 dictiionary 而 hashmap继承自abstractmap

hashtable的put方法如下

public synchronized v put(k key, v value) { //###### 注意这里1 
 // make sure the value is not null 
 if (value == null) { //###### 注意这里 2 
 throw new nullpointerexception(); 
 } 
 // makes sure the key is not already in the hashtable. 
 entry tab[] = table; 
 int hash = key.hashcode(); //###### 注意这里 3 
 int index = (hash & 0x7fffffff) % tab.length; 
 for (entry e = tab[index]; e != null; e = e.next) { 
 if ((e.hash == hash) && e.key.equals(key)) { 
  v old = e.value; 
  e.value = value; 
  return old; 
 } 
 } 
 modcount++; 
 if (count >= threshold) { 
 // rehash the table if the threshold is exceeded 
 rehash(); 
 tab = table; 
 index = (hash & 0x7fffffff) % tab.length; 
 } 
 // creates the new entry. 
 entry e = tab[index]; 
 tab[index] = new entry(hash, key, value, e); 
 count++; 
 return null; 
}

注意1 方法是同步的

注意2 方法不允许value==null

注意3 方法调用了key的hashcode方法,如果key==null,会抛出空指针异常 hashmap的put方法如下

public v put(k key, v value) { //###### 注意这里 1 
 if (key == null) //###### 注意这里 2 
 return putfornullkey(value); 
 int hash = hash(key.hashcode()); 
 int i = indexfor(hash, table.length); 
 for (entry e = table[i]; e != null; e = e.next) { 
 object k; 
 if (e.hash == hash && ((k = e.key) == key || key.equals(k))) { 
  v oldvalue = e.value; 
  e.value = value; 
  e.recordaccess(this); 
  return oldvalue; 
 } 
 } 
 modcount++; 
 addentry(hash, key, value, i); //###### 注意这里 
 return null; 
}

注意1 方法是非同步的

注意2 方法允许key==null

注意3 方法并没有对value进行任何调用,所以允许为null

补充:

hashtable 有一个 contains方法,容易引起误会,所以在hashmap里面已经去掉了

当然,2个类都用containskey和containsvalue方法。

hashmap hashtable
父类 abstractmap dictiionary
是否同步
k,v可否null

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

hashmap允许将null作为一个entry的key或者value,而hashtable不允许。

hashmap把hashtable的contains方法去掉了,改成containsvalue和containskey。因为contains方法容易让人引起误解。

hashtable继承自dictionary类,而hashmap是java1.2引进的map interface的一个实现。

最大的不同是,hashtable的方法是synchronize的,而hashmap不是,在多个线程访问hashtable时,不需要自己为它的方法实现同步,而hashmap 就必须为之提供外同步(collections.synchronizedmap)。

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

总结:

hashmap中键值 允许为空 并且是非同步的

hashtable中键值 不允许为空 是同步的

继承不同,但都实现了map接口

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持。