Hashtable,HashMap,TreeMap的区别

本文深入探讨了Java集合类库中的Hashtable与HashMap的区别,包括它们的线程安全性、对null的支持、性能特点及内部实现机制。同时,还介绍了基于红黑树实现的TreeMap,详细解释了其排序方式及时间复杂度。

Hashtable

Hashtable是java集合类库早期的一个实现(类名Hashtable不是HashTable),线程同步,不支持null键和值,由于同步,性能较差。

	//synchronized同步
    public synchronized V put(K key, V value) {
       // Make sure the value is not null
       //值不能为null
       if (value == null) {
           throw new NullPointerException();
       }

       // Makes sure the key is not already in the hashtable.
       Entry<?,?> tab[] = table;
       int hash = key.hashCode();
       int index = (hash & 0x7FFFFFFF) % tab.length;
       @SuppressWarnings("unchecked")
       Entry<K,V> entry = (Entry<K,V>)tab[index];
       //值不能为null
       for(; entry != null ; entry = entry.next) {
           if ((entry.hash == hash) && entry.key.equals(key)) {
               V old = entry.value;
               entry.value = value;
               return old;
           }
       }

       addEntry(hash, key, value, index);
       return null;
   

HashMap

HashMap是最常用的集合类之一,底层实现由数据和链表构成。
HashMap线程不同步,可支持null键和值。
HashMap默认容量为16,且要求容量一定为2的整数次幂,当元素增长到需扩容时,默认增加长度一倍
数据中存储的是桶(bucket)后面跟着存储键值对的链表,HashMap通过计算需存储元素的哈希值,决定该元素存储在数据的哪个位置上。相同哈希值的键值对会存在数据的同一个位置上,按链表形式存储。
当相同哈希值的元素个数超过设定的阈值(TREEIFY_THRESHOLD,默认为8)时,则会由链表自动转成红黑
树形式存储。

存储格式:
在这里插入图片描述

TreeMap

TreeMap是一种有序的,基于红黑树实现的Map。常用的put,get,remove时间复杂度O(log(n)),操作速度较慢。元素排序方式,由其成员变量comparator决定:

    /**
     * The comparator used to maintain order in this tree map, or
     * null if it uses the natural ordering of its keys.
     *
     * @serial
     */
    private final Comparator<? super K> comparator;

可以在TreeMap初始化时,传入自定义的Comparator,以满足自己的排序需要。

  public TreeMap(Comparator<? super K> comparator) {
        this.comparator = comparator;
    }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值