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

一.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接口

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

(0)

相关推荐

  • 浅析Java中Map与HashMap,Hashtable,HashSet的区别

    HashTable和HashMap区别 第一,继承的父类不同.Hashtable继承自Dictionary类,而HashMap继承自AbstractMap类.但二者都实现了Map接口. 复制代码 代码如下: public class Hashtable<K,V>extends Dictionary<K,V>implements Map<K,V>, Cloneable, Serializable public class HashMap<K,V>extends

  • Java中HashMap和Hashtable的区别浅析

    HashMap是Hashtable的轻量级实现(非线程安全的实现),他们都完成了Map接口,主要区别在于HashMap允许空(null)键值(key),由于非线程安全,效率上可能高于Hashtable. HashMap允许将null作为一个entry的key或者value,而Hashtable不允许. HashMap把Hashtable的contains方法去掉了,改成containsvalue和containsKey.因为contains方法容易让人引起误解. Hashtable继承自Dict

  • 浅析java中ArrayList与Vector的区别以及HashMap与Hashtable的区别

    就ArrayList与Vector主要从二方面来说.一.同步性:Vector是线程安全的,也就是说是同步的,而ArrayList是线程序不安全的,不是同步的 二.数据增长:当需要增长时,Vector默认增长为原来一培,而ArrayList却是原来的一半 就HashMap与HashTable主要从三方面来说.一.历史原因:Hashtable是基于陈旧的Dictionary类的,HashMap是Java 1.2引进的Map接口的一个实现 二.同步性:Hashtable是线程安全的,也就是说是同步的,

  • Java中Hashtable类与HashMap类的区别详解

    Hashtable类 Hashtable继承Map接口,实现一个key-value映射的哈希表.任何非空(non-null)的对象都可作为key或者value. 添加数据使用put(key, value),取出数据使用get(key),这两个基本操作的时间开销为常数. Hashtable通过initial capacity和load factor两个参数调整性能.通常缺省的load factor 0.75较好地实现了时间和空间的均衡.增大load factor可以节省空间但相应的查找时间将增大,

  • Java中HashMap和Hashtable及HashSet的区别

    Hashtable类   Hashtable继承Map接口,实现一个key-value映射的哈希表.任何非空(non-null)的对象都可作为key或者value. 添加数据使用put(key,value),取出数据使用get(key),这两个基本操作的时间开销为常数. Hashtable通过initial   capacity和load   factor两个参数调整性能.通常缺省的load   factor   0.75较好地实现了时间和空间的均衡.增大load   factor可以节省空间但

  • HashMap 和 Hashtable的区别

    HashMap和Hashtable的比较是Java面试中的常见问题,用来考验程序员是否能够正确使用集合类以及是否可以随机应变使用多种思路解决问题.HashMap的工作原理.ArrayList与Vector的比较以及这个问题是有关Java 集合框架的最经典的问题.Hashtable是个过时的集合类,存在于Java API中很久了.在Java 4中被重写了,实现了Map接口,所以自此以后也成了Java集合框架中的一部分.Hashtable和HashMap在Java面试中相当容易被问到,甚至成为了集合

  • java中Hashtable和HashMap的区别分析

    1.Hashtable是Dictionary的子类, 复制代码 代码如下: public class Hashtable<K,V>     extends Dictionary<K,V>     implements Map<K,V>, Cloneable, java.io.Serializable HashMap: 复制代码 代码如下: public class HashMap<K,V>    extends AbstractMap<K,V> 

  • Java容器HashMap与HashTable详解

    1.HashMap HashMap继承抽象类AbstractMap,实现接口Map.Cloneable, Serializable接口.HashMap是一种以键值对存储数据的容器, 由数组+链表组成,其中key和value都可以为空,key的值唯一.HashMap是非线程安全的, 对于键值对<Key,Value>, HashMap内部会将其封装成一个对应的Entry<Key,Value>对象.HashMap的存储空间大小是可以动态改变的: 存储过程 每个对象都有一个对应的HashC

  • HashMap和Hashtable的详细比较

    HashMap和Hashtable的详细比较 前言: 可以直接根据hashcode值判断两个对象是否相等吗?肯定是不可以的,因为不同的对象可能会生成相同的hashcode值.虽然不能根据hashcode值判断两个对象是否相等,但是可以直接根据hashcode值判断两个对象不等,如果两个对象的hashcode值不等,则必定是两个不同的对象.如果要判断两个对象是否真正相等,必须通过equals方法. 也就是说对于两个对象,如果调用equals方法得到的结果为true,则两个对象的hashcode值必

  • java HashMap和HashTable的区别详解

    HashMap和HashTable,这二者的区别经常被别人问起,今天在此总结一下. (一)继承的历史不同 public class Hashtable extends Dictionary implements Map public class HashMap extends AbstractMap implements Map Hashtable是继承自Dictionary类的,而HashMap则是Java 1.2引进的Map接口的一个实现. (二)安全性不同 HashMap是非synchro

随机推荐