1.HashTable
- HashTable是线程安全的,但是效率特别低,因为当一个线程访问HashTable的同步方法时,其他线程再访问HashTable的同步方法,会发生阻塞
,如线程1在执行put操作时,线程2不但不能使用put,甚至不能使用get来获取数据,所以效率非常低下。
- HashTable的键值都不能非空,否则会报空指针。
- 实现线程安全的原理,是几乎HashTable的实现类的public方法都有synchronized来修饰。
2.HashMap
- HaspMap的实现原理是数组加链表,(1.8是数组+链表+红黑树)
- 是线程不安全的集合,不能用于多线程多并发的情况,其不安全主要是多个线程在put或扩容时形成链表环,当通过get执行一个不存在的key时就有可能发生死循环。
- 其中键值都可以为空,如果插入相同的键则会覆盖原有的
- 通过key根据hashCode函数来算出hash值,(index = HashCode(Key) & (Length - 1))再用hash值取mod运算得到在数组中的位置,如果数组中该位置没有值则直接插入,反之,如果数组中有值, 则会插入链表中,当链表的个数超过8时,将链表转化为红黑树的结构。
- 扩容,当数组中的键值对超过数组长度x0.75时,数组会自动扩容,一般是采用2倍扩容。
3.HashSet
- 存储的数据不可重复,原因是底层是采用HashMap来实现的,其中set的值作为HashMap的键存储,HashMap的值设定一个固定的静态常对象。