HashMap和HashTable的区别
HashMap线程不安全,HashTable是线程安全的。HashMap内部实现没有任何线程同步相关的代码,所以相对而言性能要好一点。如果在多线程中使用HashMap需要自己管理线程同步。HashTable大部分对外接口都使用synchronized包裹,所以是线程安全的,但是性能会相对差一些。
二者的基类不一样。HashMap派生于AbstractMap,HashTable派生于Dictionary。它们都实现Map, Cloneable, Serializable这些接口。AbstractMap中提供的基础方法更多,并且实现了多个通用的方法,而在Dictionary中只有少量的接口,并且都是abstract类型。
key和value的取值范围不同。HashMap的key和value都可以为null,但是HashTablekey和value都不能为null。对于HashMap如果get返回null,并不能表明HashMap不存在这个key,如果需要判断HashMap中是否包含某个key,就需要使用containsKey这个方法来判断。
算法不一样。HashMap的initialCapacity为16,而HashTable的initialCapacity为11。HashMap中初始容量必须是2的幂,如果初始化传入的initialCapacity不是2的幂,将会自动调整为大于出入的initialCapacity最小的2的幂。HashMap使用自己的计算hash的方法(会依赖key的hashCode方法),HashTable则使用key的hashCode方法得到。
HashMap数据结构模型
日常开发中的使用建议
如果在单线程的环境中建议使用HashMap,HashMap性能更好一些。
如果是多线程环境也不建议使用HashTable,而是使用ConcurrentHashMap,ConcurrentHashMap也是线程安全的,并且比HashTable性能好。
HashMap在确定数据大小的情况想,建议初始化一个合适的容量,否则可能会面resieze,resize操作是一个非常耗时的过程。
如果把自定以的类作为HashMap或者HashTable的key,就需要重写hashCode和equals方法。
领取专属 10元无门槛券
私享最新 技术干货