HashMap和HashTable的异同点

HashMap和HashTable异同点

底层数据: HashMap和HashTable底层数据结构相同,都是以数组加链表形式存储数据。

继承关系: HashMap和HashTable都实现了Clonable ,Map,Serializable接口。 但不同的是HashTable继承了Dictionary接口。
public class HashMap<K,V>
extends AbstractMap<K,V>
implements Map<K,V>, Cloneable, Serializable

public class Hashtable<K,V>
extends Dictionary<K,V>
implements Map<K,V>, Cloneable, java.io.Serializable{}

增长方式: 扩容时机相同,都是在size大于扩容阈值(数组容量×加载因子)的时候进行扩容。 但HashMap扩容方式是2table.length ,而HashTable是2table.length + 1。

内部方法 : HashTable的put方法,remove方法都有关键字sychronized修饰(确保安全性)。

Key-Value键值对:HashMap中的key不能重复,key和value都可以为null。 而HashTable的key和value都不能为null。

遍历方式:HashMap可以通过迭代器进行遍历。 而HashTable有特有的枚举方法进行遍历。

Key—Value为null情况:HashMap的put方法: HashMap遇到key为null的时候,调用putForNullKey方法进行处理,而对value没有处理;Hashtable遇到null,直接返回NullPointerException。

安全性: HasMap线程不安全,Hashtable线程安全(因为有关键字Sychronized修饰)

其他
HashMap 和 hashtable= (同时处理(put)10W,100W,40000W数据) ,比较快慢?

  HashMap<Integer,Integer> hashMap = new HashMap<>();
  long b = System.currentTimeMillis();
  for(int i=0; i<NUM; i++) {
        hashMap.put((int) (Math.random()*10),(int) (Math.random()*10));
  }
  long e = System.currentTimeMillis();
  System.out.println("hashmap time : " + (e-b));
    
  Hashtable<Integer,Integer> hashtable = new Hashtable<>();
  long b1 = System.currentTimeMillis();
  for(int i=0; i<NUM; i++) {
        hashtable.put((int) (Math.random()*10),(int) (Math.random()*10));
  }
  long e1 = System.currentTimeMillis();
  System.out.println("hashtable time : " + (e1-b1));

结果::HashMap 比 hashtable 快。

原因(hashtable:sychronized修饰,java程序和操作系统相互切换 (用户端和内核相互切换)) 而HashMap只在用户端操作,不用切换。 (在单线程下 数据不多的情况用HashMap。)
sychronized关键字是一个重量级锁(只能有一个线程对其进行操作),涉及用户空间和内核空间的切换 ;

猜你喜欢

转载自blog.csdn.net/java_cG/article/details/83929081
今日推荐