Hashtable与HashMap

Hashtable

  • 底层采用数组+链表
  • 无论是 key 还是 value 不能为null
  • 实现线程是安全的 效率低
  • 默认构造函数 已经初始化了
  • 初始size 值为 11 扩容 newSize = oldSize * 2 +1
        int newCapacity = (oldCapacity << 1) + 1;

HashMap

  • 底层采用哈希表(动态数组 +链表(或者红黑树))
  • 数组的动态数组保证
  • 链表到 红黑树的相互保证
  • 存储的是一个K,V对象 每一个都是 map.Entry 对象
  • key可以为空
  • 初始值为 16
  • hashmap中的键值对大于阀值时或者初始化时,就调用resize方法进行扩容;
    每次扩展的时候,都是扩展2倍;

TreeMap

在这里插入图片描述
在这里插入图片描述

TreeMap 底层红黑树
有序的map集合,comparator 基于key排序(默认comparator )
直接看源码吧 害

  Entry<K,V> t = root;
        if (t == null) {
            compare(key, key); // type (and possibly null) check

            root = new Entry<>(key, value, null);
            size = 1;
            modCount++;
            return null;
        }
        int cmp;
        Entry<K,V> parent;
        // split comparator and comparable paths
        Comparator<? super K> cpr = comparator;
        if (cpr != null) {
            do {
                parent = t;
                cmp = cpr.compare(key, t.key);
                if (cmp < 0)
                    t = t.left;
                else if (cmp > 0)
                    t = t.right;
                else
                    return t.setValue(value);
            } while (t != null);
        }

compare(key, key)
一次添加数据直接添加到节点是;
递归调用 查找红黑树,
你有比较器的,就会用传入的 ,没有的话 就会用默认的比较器,

Treeset

在这里插入图片描述
Treeset 底层依赖TreeMap

    public TreeSet() {
        this(new TreeMap<E,Object>());
    }

HashSet 底层依赖 HashMap


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

两大集合体系完成他们相辅相成的一套体系

今天在一个实际场景里用hashmap ,遍历出来的顺序一直是乱的所以尝试几种方法之后还是选用了LinkedHashMap
我们都是到HashMap是一种非常常见、非常有用的集合,但在多线程情况下使用不当会有线程安全问题,只要不涉及线程安全问题hsahMap 完全可以满足我们使用,但是他取出来的顺序是无序的这时候就用到了 LinkedHashMap
特点

LinkedHashMap是否允许空 Key和Value都允许空
LinkedHashMap是否允许重复数据 Key重复会覆盖、Value允许重复
LinkedHashMap是否有序 有序
LinkedHashMap是否线程安全 非线程安全
直接看这个来链接吧
https://www.cnblogs.com/xiaoxi/p/6170590.html.

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值