HashMap、TreeMap和HashTable异同及源码分析

Map

  • 特点:

    • 用于存储任意键值对(Key-Value)
    • 键:无序、无下标、不允许重复
    • 值:无序、无下标、允许重复
  • 方法:

    Modifier and TypeMethod and Description
    voidclear() 从该地图中删除所有的映射(可选操作)。
    default Vcompute(K key, BiFunction<? super K,? super V,? extends V> remappingFunction) 尝试计算指定键的映射及其当前映射的值(如果没有当前映射, null )。
    default VcomputeIfAbsent(K key, Function<? super K,? extends V> mappingFunction) 如果指定的键尚未与值相关联(或映射到 null ),则尝试使用给定的映射函数计算其值,并将其输入到此映射中,除非 null
    default VcomputeIfPresent(K key, BiFunction<? super K,? super V,? extends V> remappingFunction) 如果指定的密钥的值存在且非空,则尝试计算给定密钥及其当前映射值的新映射。
    booleancontainsKey(Object key) 如果此映射包含指定键的映射,则返回 true
    booleancontainsValue(Object value) 如果此地图将一个或多个键映射到指定的值,则返回 true
    Set<Map.Entry<K,V>>entrySet() 返回此地图中包含的映射的Set视图。
    booleanequals(Object o) 将指定的对象与此映射进行比较以获得相等性。
    default voidforEach(BiConsumer<? super K,? super V> action) 对此映射中的每个条目执行给定的操作,直到所有条目都被处理或操作引发异常。
    Vget(Object key) 返回到指定键所映射的值,或 null如果此映射包含该键的映射。
    default VgetOrDefault(Object key, V defaultValue) 返回到指定键所映射的值,或 defaultValue如果此映射包含该键的映射。
    inthashCode() 返回此地图的哈希码值。
    booleanisEmpty() 如果此地图不包含键值映射,则返回 true
    Set<K>keySet() 返回此地图中包含的键的Set视图。
    default Vmerge(K key, V value, BiFunction<? super V,? super V,? extends V> remappingFunction) 如果指定的键尚未与值相关联或与null相关联,则将其与给定的非空值相关联。
    Vput(K key, V value) 将指定的值与该映射中的指定键相关联(可选操作)。
    voidputAll(Map<? extends K,? extends V> m) 将指定地图的所有映射复制到此映射(可选操作)。
    default VputIfAbsent(K key, V value) 如果指定的键尚未与某个值相关联(或映射到 null )将其与给定值相关联并返回 null ,否则返回当前值。
    Vremove(Object key) 如果存在(从可选的操作),从该地图中删除一个键的映射。
    default booleanremove(Object key, Object value) 仅当指定的密钥当前映射到指定的值时删除该条目。
    default Vreplace(K key, V value) 只有当目标映射到某个值时,才能替换指定键的条目。
    default booleanreplace(K key, V oldValue, V newValue) 仅当当前映射到指定的值时,才能替换指定键的条目。
    default voidreplaceAll(BiFunction<? super K,? super V,? extends V> function) 将每个条目的值替换为对该条目调用给定函数的结果,直到所有条目都被处理或该函数抛出异常。
    intsize() 返回此地图中键值映射的数量。
    Collection<V>values() 返回此地图中包含的值的Collection视图。

HashMap

TreeMap

  • 线程不安全,实现了SortedMap接口,可以对key自动排序

  • 存储结构:红黑树

  • 源码分析:

    • 默认参数

      参数解释默认值
      comparator比较器
      root根节点
      size包含键值对的数量0
      modCount记录被修改的次数0
    • 构造函数

    public TreeMap() {
        comparator = null;
    }
    
    public TreeMap(Comparator<? super K> comparator) {
        this.comparator = comparator;
    }
    
    
    public TreeMap(Map<? extends K, ? extends V> m) {
        comparator = null;
        putAll(m);
    }
    
    
    public TreeMap(SortedMap<K, ? extends V> m) {
        comparator = m.comparator();
        try {
            buildFromSorted(m.size(), m.entrySet().iterator(), null, null);
        } catch (java.io.IOException cannotHappen) {
        } catch (ClassNotFoundException cannotHappen) {
        }
    }
    ```

  - 源码分析
	见hashmap源码分析红黑树部分
    -[HashMap源码分析,源码逐行解释](https://blog.csdn.net/m0_38112165/article/details/108951472)

### HashTable

- 线程安全,不允许key和value是null

- 存储结构:JDK1.8之前(数组+链表);JDK1.8之后(数组+链表+红黑树)

- 源码分析:

  与HashMap相比,方法前添加了``synchronized``关键字,源码分析见HashMap
 -[HashMap源码分析,源码逐行解释](https://blog.csdn.net/m0_38112165/article/details/108951472)
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值