HashMap和HashTable的异同点

HashMap和HashTable异同点

底层数据

HashMap(1.7)和HashTable底层数据结构相同,都是以数组加链表形式存储数据。 (注:1.8是链表长度到达8,链表会转换成红黑树)

继承关系

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情况的put方法

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关键字是一个重量级锁(只能有一个线程对其进行操作),涉及用户空间和内核空间的切换 ;

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值