Hashtable、Hashset傻傻分不清?

其实本来说不写这两个类了,但是跟一块心病似的。还是写了吧,把这些不太熟的犄角旮瘩都打扫一遍!

Hashtable

public class Hashtable<K,V>
    extends Dictionary<K,V>
    implements Map<K,V>, Cloneable, java.io.Serializable {

Dictionary是一个废弃类,就不关注它了。可以看到还实现了Map接口,所以是一个键值对结构。Map中无非就是些增删查改的APi,不再赘述。

private transient Entry<?,?>[] table;
 
private transient int count;

private int threshold;

private float loadFactor;

 protected Entry(int hash, K key, V value, Entry<K,V> next) {
            this.hash = hash;
            this.key =  key;
            this.value = value;
            this.next = next;
        }

public V setValue(V value) {
            if (value == null)
                throw new NullPointerException();
}

可以看到基本结构与hashmap一致,底层就是哈希桶,哈希桶中每个桶都是链表,与hashmap的不同就是这里的entry中的value不能为空,会抛出NPE。
其实hashtable真挺没劲的,相关方法都跟hashmap类似,但是都没hashmap写得好。。hashtable想比hashmap唯一的优点可能就是线程安全,每个操作方法都被synchronized锁住了,可是这一锁就把整个entry数组锁住了,锁的粒度太大了,并发性远不如Concurrenthashmap来的好,所以,给个结论,hashtable这玩意儿已经废弃了。。。既没concurrenthashmap好用,也没hashmap来的巧妙。

Hashset

public class HashSet<E>
    extends AbstractSet<E>
    implements Set<E>, Cloneable, java.io.Serializable

可以看到hashset就是个set,即里边没有重复元素

 private transient HashMap<E,Object> map;

    private transient HashMap<E,Object> map;
    
    private static final Object PRESENT = new Object();

    public HashSet() {
        map = new HashMap<>();
    }

其内部就是个hashmap,一旦初始化就也将hashmap初始化。这也是其设计巧妙之处,通过hashmap实现元素的唯一性,即每个加入进来的元素都作为key放入hashmap,相对应的value就是这里的PRESENT,即每个元素都是key,value是同一个值。

public boolean add(E e) {
        return map.put(e, PRESENT)==null;
    }

hashmap的put函数会返回该key对应的原来的value,如果原来value不是空,说明对应位置本来就有值,即我们正在加入重复值,返回false,以此来保证hashset中的元素的不可重复。

其他各项方法也是类似,其实就是hashset中包着一层hashmap,巧妙地实现set的不可重复。

公众号:程序员二狗

每日原创文章,一起交流学习!

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
HashMap、HashtableHashSet是Java中常用的集合类。 HashMap和Hashtable都实现了Map接口,用于存储键值对。它们的主要区别在于线程安全性和同步性。HashMap是非线程安全的,而Hashtable是线程安全的。这意味着多个线程可以同时访问Hashtable,但不能同时访问HashMap。此外,HashMap允许存储null键值对,而Hashtable不允许。Java 5引入的ConcurrentHashMap可以作为Hashtable的替代,它在扩展性方面更好。 HashSet实现了Set接口,用于存储无序、不重复的元素。它底层使用HashMap来存储数据,HashSet存储对象而不存储键值对。 总结一下,HashMap和Hashtable都是用于存储键值对的,区别在于线程安全性和同步性。HashSet是用于存储不重复元素的集合。 引用: HashMap和Hashtable都实现了Map接口,主要的区别有:线程安全性,同步(synchronization),以及速度。HashMap几乎可以等价于Hashtable,除了HashMap是非synchronized的,并可以接受null(HashMap可以接受为null的键值(key)和值(value),而Hashtable则不行)。 HashMap是非synchronized,而Hashtable是synchronized,意味着Hashtable是线程安全的,多个线程可以共享一个Hashtable;而多个线程是不能共享HashMap的。Java 5提供了ConcurrentHashMap,它是HashTable的替代,比HashTable的扩展性更好。另一个区别是HashMap的迭代器(Iterator)是fail-fast迭代器,而Hashtable的enumerator迭代器。 HashMap可以通过下面的语句进行同步:Map m = Collections.synchronizeMap(hashMap); 引用:HashMap和Hashtable两个类都实现了Map接口,二者保存K-V对(key-value对);HashSet则实现了Set接口,性质类似于集合。 引用:HashSet:散列表,无序的,不会记录插入的顺序,实现了 Set 接口,以对象作为元素,拒绝接受重复的对象,底层依靠 HashMap来存储数据, 底层使用HashTable来保证元素的不重复性,实际上使用的是HashMap的一个实例。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* [java集合HashMap、HashTableHashSet详解](https://blog.csdn.net/weixin_38166557/article/details/99230114)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_1"}}] [.reference_item style="max-width: 33.333333333333336%"] - *2* [浅析Java中Map与HashMap,Hashtable,HashSet的区别](https://download.csdn.net/download/weixin_38570296/12813847)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_1"}}] [.reference_item style="max-width: 33.333333333333336%"] - *3* [Java:HashMap、HashSetHashTable](https://blog.csdn.net/weixin_48493408/article/details/123465326)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_1"}}] [.reference_item style="max-width: 33.333333333333336%"] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值