HashSet和HashTable的的源码分析
HashSet
HashSet其实就是使用HashMap来实现的,方法都是依靠Hash Map的方法。如hashSet构造,hashSet的添加等操作。这样能够实现hashset去重。因为hashMap的key不能重复。这样就能看上篇,当hashMap遇到key值重复的处理。
HashSet结构源码
HashSet的结构就相当于HashMap只将key值put进去,但是Value值却为空的new Object。可以看作为只有key的HashMap.
1 | /* 可以看到hashSet的这几个构造方法和HashMap息息相关 */ |
HashSet的基本方法
add和remove和size等基本方法都是调用HashMap的
如add方法:
1 | public boolean add(E e) { |
HashSet的Iterator和contains方法
同样的也是调用的HashMap的基本方法,但是需要先得到Map的keySet集合
1 | public Iterator<E> iterator() { |
HashTable
首先HashTable和HashMap的结构类似。但是有最重要的区别就是HashTable是synchronized的,也就是线程安全的。在他的基本方法前都有synchronized锁所限制。
结构就不看了,只看一个Put方法
1 |
|
通过上面的代码可以看出HashTable和HashMap的结构还是有差异的,HashMap是纵向的列表当出现相同的hash值的时候,扩展出横向列表,当横向的列表到达一定的长度的时候,这个横向的链表就会自动整理成红黑树的形式,而hashTable不存在横向的这种结构的,当count>=阈值的时候就会把Hash重置,使之不会出现hash值重复的情况。可以说hashTable比较hashMap的结构更简单,但是效率会比HashMap的低。