A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 李爱霞 黑马帝   /  2011-12-30 11:06  /  2624 人查看  /  2 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 李爱霞 于 2011-12-30 11:12 编辑

HashMap、HashSet、Hashtable 这三种之间的存在什么样的关系,他们又是怎么对数据存储的,能不能说一下他们之间的区别和联系。比较常用的有哪几种?

评分

参与人数 1技术分 +1 收起 理由
杨强 + 1

查看全部评分

2 个回复

倒序浏览
HashMap / HashTable / HashSet
HashTable 与 HashMap:
          表面:
                  HashTable不允许null值(key和value都不可以),HashMap允许null值(key和value都可以)。
          HashTable的方法是同步的,HashMap未经同步,所以在多线程场合要手动同步HashMap这个区别就像Vector和ArrayList一样。
          HashTable有一个contains(Object value),功能和containsValue(Object value)功能一样。
          HashTable使用Enumeration,HashMap使用Iterator。   
      内部:
          HashTable中hash数组默认大小是11,增加的方式是 old*2+1。HashMap中hash数组的默认大小是16,而且一定是2的指数。         
          哈希值的使用不同,HashTable直接使用对象的hashCode,代码是这样的:
              int hash = key.hashCode();
                  int index = (hash & 0x7FFFFFFF) % tab.length;
              而HashMap重新计算hash值,而且用与代替求模:
             int hash = hash(k);
                  int i = indexFor(hash, table.length);
                  static int hash(Object x) {
               int h = x.hashCode();
                       h += ~(h << 9);
              h ^= (h >>> 14);
              h += (h << 4);
              h ^= (h >>> 10);
              return h;
                 }
                 static int indexFor(int h, int length) {
              return h & (length-1);
                }
  HashSet 、 HashMap:
           HashMap可以看作三个视图:key的Set,value的Collection,Entry的Set。这里HashSet就是其实就是HashMap的一个视图。HashSet内部就是使用Hashmap实现的,和Hashmap不同的是它不需要Key和Value两个值。
        往hashset中插入对象其实只不过是内部做了
              public boolean add(Object o) {
                    return map.put(o, PRESENT)==null;
              }
        往hashset中插入对象其实只不过是内部做了
              public boolean add(Object o) {
                    return map.put(o, PRESENT)==null;
              }         
     HashMap为散列映射,它是基于hash table的一个实现,它可在常量时间内安插元素,或找出一组key-value pair.
     HashSet为散列集,它把查找时间看的很重要,其中所有元素必须要有hashCode()

评分

参与人数 1技术分 +1 收起 理由
杨强 + 1

查看全部评分

回复 使用道具 举报
HashSet
                存储原理
                        每次存储对象的时候, 调用该对象的hashCode()方法得到哈希值, 在集合中查找是否有哈希值相同的对象.
                        如果没有哈希值相同的对象, 直接存入.
                        如果有哈希值相同的对象, 则和哈希值相同的对象进行equals()比较.
                        比较结果为false直接存入, 结果为true则不存.
                过滤属性相同元素
                        如果我们希望HashSet能够过滤属性重复的元素, 那么就需要重写hashCode()和equals().
                        属性相同的对象hashCode()方法要返回同一个哈希值, 属性相同的对象equals()方法要返回true.
                        为了提高效率, hashCode()方法在属性不同的时候尽量返回不同的哈希值.

HashMap (线程不安全,存取速度快,允许存放null键,null值。)
在每次存储键值对的时候, 调用Key对象的hashCode()方法计算一个哈希值. 在集合中查找是否有哈希值相同的Key对象.
                如果没有哈希值相同的Key对象就直接存入键值对.
                如果有哈希值相同的Key对象, 那么和这些相同的Key对象进行equals()比较.
                比较结果为false就直接存入, 比较结果为true则将Value对象覆盖.

Hashtable
线程安全,速度慢,不允许存放null键,null值,已被HashMap替代。


评分

参与人数 1技术分 +1 收起 理由
杨强 + 1

查看全部评分

回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马