HashMap Hashtable区别

 2023-09-05 阅读 180 评论 0

摘要:2019独角兽企业重金招聘Python工程师标准>>> 1.HashMap基础自AbstractMap,Hashtable继承自Dictionary public class HashMap extends AbstractMap implements Map, Cloneable, Serializable public class Hashtable extends Dictionary implements Map, Clon

2019独角兽企业重金招聘Python工程师标准>>> hot3.png

1.HashMap基础自AbstractMap,Hashtable继承自Dictionary  

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

2.通过比较put方法的实现来比较两个类的区别

//HashMap的put方法
public V put(K key, V value) { //注意1 方法是非同步的if (key == null)  //注意2 方法允许key==null 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);  //注意3 方法并没有对value进行任何调用,所以允许为null  return null;  
}  

 

//Hashtable的put方法
public synchronized V put(K key, V value) {  //注意1 方法是同步的  // Make sure the value is not null  if (value == null) { //注意2 方法不允许value==null  throw new NullPointerException();  }  // Makes sure the key is not already in the hashtable.  Entry tab[] = table;  int hash = key.hashCode(); // 注意3 方法调用了key的hashCode方法,如果key==null,会抛出空指针异常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;  
}  

补充: 
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的两种迭代方式比较)

方式一:采用keySet进行迭代

  //对hashMap的迭代.先迭代key 在迭代值的  java.util.HashMap a=new java.util.HashMap();  Iterator it= a.keySet().iterator()  while (it.hasNext()) {  Object key=it.next();  System.out.println("key:"+key);  System.out.println("value:"+a.get(key));  }

方式二:采用entrySet进行迭代

//采用entrySet只需要进行一次迭代
Iterator i = hasmap.entrySet().iterator();  
while(i.hasNext()){  Entry  entry=(Entry)it.next();  Object key=entry.getKey();  Object value=entry.getValue();  
}

比较两种迭代方式,方式一需要进行两次迭代,而方式二只需要进行一次迭代,所以方式二的性能要优于方式一

转载于:https://my.oschina.net/u/2988360/blog/826924

版权声明:本站所有资料均为网友推荐收集整理而来,仅供学习和研究交流使用。

原文链接:https://hbdhgg.com/1/857.html

发表评论:

本站为非赢利网站,部分文章来源或改编自互联网及其他公众平台,主要目的在于分享信息,版权归原作者所有,内容仅供读者参考,如有侵权请联系我们删除!

Copyright © 2022 匯編語言學習筆記 Inc. 保留所有权利。

底部版权信息