关于Java集合

1.Map

1.1HasMap:

作为Map的主要实现类;线程不安全的,效率高;存储null的key和value

  • 快速存储 :比如当我们对hashmap进行get和put的时候速度非常快

  • 快速查找(时间复杂度o(1))

  • 可伸缩:1数组扩容,边长。2,单线列表如果长度超过8的话会变成红黑树

1.2 LinkedHasMap

保证在遍历map元素时,可以照添加的顺序实现遍历。 原因:在原的HashMap底层结构基础上,添加了一对指针,指向前一个和后一个元素。 对于频繁的遍历操作,此类执行效率高于HashMap。

1.3 TreeMap

保证照添加的key-value对进行排序,实现排序遍历。此时考虑key的自然排序或定制排序 ,底层使用红黑树

1.4Hastable

作为古老的实现类;线程安全的,效率低;不能存储null的key和value

1.5Properties

常用来处理配置文件。key和value都是String类型

HasMap底层原理:

HashMap的底层: 数组+链表 (JDK 7.0及之前) 数组+链表+红黑树 (JDK 8.0以后)

img

扩充原则:

  • 默认容量:16

  • 默认加载因子:0.75 加载因子 = 填入表中的元素个数 / 散列表的长度 加载因子越大,填满的元素越多,空间利用率越高,但发生冲突的机会变大了;

    加载因子越小,填满的元素越少,冲突发生的机会减小,但空间浪费了更多了,而且还会提高扩容rehash操作的次数。

  • 扩容的临界值:16*0.75=12

  • 当数组的某一个索引位置上的元素以链表的形式存在的数据个数 > 8 且当前数组的长度 > 64时,此时此索引位置上的所有数据改为使用红黑树存储

  • 源码:

    • 判断数组是否为空,为空通过resize()方法创建一个新的数组

    • 判断key,使用hash算法计算hash值

      • 不为空,比较哈希值有无冲突

        • 不冲突直接存放在数组中

        • 判equals以下逻辑建立在equlas为false情况

        • 冲突,若此时的数据结构是红黑树,那就直接插入红黑树中

        • 冲突,若此时的数据结构是链表,判断插入之后是否大于等于8

          • 插入之后大于8了,就要先调整为红黑树,在插入

          • 插入之后不大于8,那么就直接插入到链表尾部即可。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值