加载中…
个人资料
  • 博客等级:
  • 博客积分:
  • 博客访问:
  • 关注人气:
  • 获赠金笔:0支
  • 赠出金笔:0支
  • 荣誉徽章:
正文 字体大小:

HashSet的底层数据结构

(2012-11-22 13:23:03)
标签:

hashset

杂谈

1、HashSet的部分源码:
     public class HashSet extends AbstractSet implements Set, Cloneable,Serializable {
               private transient HashMap map;
               private static final Object PRESENT = new Object();
                
               public HashSet() {
                   map = new HashMap();
               }
               public Iterator iterator() {
                   return map.keySet().iterator();
               }
               public boolean add(E e) {
                   return map.put(e, PRESENT)==null;
               }
               public boolean remove(Object o) {
                   return map.remove(o)==PRESENT;
               }
           }
2、HashSet的特点:
   1)由HashSet的源码可知,HashSet底层就是一个HashMap。我们在往HashSet中存储数据的时候,存的都是HashMap的键(key), 它们的值(value)都是一样的:private static final Object PRESENT = new Object()。
   2)HashSet底层的数据结构是一个哈希表,存在HashSet中的元素应该重写其hashCode()方法,故存在HashMap中的key,应该 重写其hashCode()方法。
   3)一个哈希表有三列,第一列是hash码,第二列是key,第三列是value,往哈希表中存进一个元素(即调用add()方法),会调用 key的hashCode()方法算出哈希值,根据哈希值得出该key在哈希表中的索引,接着就会遍历该索引中的所有的元素,调用key的equals() 方法,如果equals()方法返回true,则会覆盖哈希表中的元素,返回覆盖之前的值,否则就返回null。
   4)其实哈希表就是一个HashMap.Entry的数组,Entry类中有四个实例变量:
               static class Entry implements Map.Entry {
                   final K key;
                   V value;
                   Entry next; // 链表,供迭代的时候使用
                   final int hash;
                
                   Entry(int h, K k, V v, Entry n) {
                       value = v;
                       next = n;
                       key = k;
                       hash = h;
                   }
                   public final K getKey() {
                       return key;
                   }
                   public final V getValue() {
                       return value;
                   }
                   // ....
              }
   5)HashSet的实现是不同步的,也就是说HashSet是线程不安全的。

0

阅读 收藏 喜欢 打印举报/Report
  

新浪BLOG意见反馈留言板 欢迎批评指正

新浪简介 | About Sina | 广告服务 | 联系我们 | 招聘信息 | 网站律师 | SINA English | 产品答疑

新浪公司 版权所有