美文网首页收藏
一些个容器

一些个容器

作者: go_2021 | 来源:发表于2022-02-18 10:06 被阅读0次

arrayList和linkedList

arrayList是数组,默认10个大小 然后满了之后1.5倍扩容。
linkedList是双向链表。
CopyOnWriteArrayList
改的时候加个r锁,然后new 新的数组->system.arraycopy复制到新的数组里,方法来扩容或者缩短。
stringbuffer,stringbuilder,也是system.arraycopy~但是这里没有创建新数组,而是修改了原数组。
https://www.jianshu.com/p/a0582f2c5ec8

hashMap

hashMap 数组+链表来实现 默认16 扩容 *2。

hashSet
hashMap包一层,添加就是把值当做key加到hashMap里,方法都是调用hashMap的。

为啥是 16
因为 确定key 数组下标的是 (n-1) & hash
的算法 如果太大 浪费初始的空间 16 对应 n-1 的二进制是 1111。

为啥hash 不用hashcode?
因为hashcode是int 对应2进制32。hash的运算是h^(h>>>16),32位右移16和原来的32取异或,等同前16位和后16位取异或。
就是要尽量和每一位数据都有关系,这样减少碰撞。

为啥0.75?
这就设计到 一个阈值的问题了 太小可能导致内存浪费 太大链表太长 影响查询效率。

位运算:
与(&) 非(~) 或(|) 异或( ^ 相同为0 否则为1)

线程安全问题
1.并发put,key丢失。并发到同一槽里。
2.扩容时,getkey为null。

  1. jdk7扩容+头插,形成环。

jdk1.8

hashmap

  • 懒加载,put才会初始化数组。
  • 链表,86转换红黑。
  • hash算法变了。
  • 之前头插,现在尾插。 头插在并发扩容的时候,会有形成环的bug。

concurrentHashMap

  • segment+reentrantLock 16个分段 最多16个锁。
  • node+cas+s锁。reentrantlock改为s锁 1.8s锁 性能和r锁不分上下,使用简单。扩容,锁数量会变得不固定。
  • 链表
    cas操作:从0到1。
    s锁操作:从1到多。
    大于8红黑树 小于6链表。

linkedHashMap

  • 按照插入的时间进行遍历。
  • 加一层双向链表。

treeHashMap

  • 按照一定规则进行排序。
  • 红黑树结构实现排序。

相关文章

  • 一些个容器

    arrayList和linkedList arrayList是数组,默认10个大小 然后满了之后1.5倍扩容。li...

  • 一起来聊聊 ConcurrentMap

    我们来看这个经常在多线程的情况下使用的这些个容器,从Map开始讲,Map经常用的有这么几个。 Concurrent...

  • 一些个过往

    昨天,女神节(三八妇女节)的第二天,和妹妹相约一起去剪头。 这一段日子,因为嘉嘉考研的事情,大家一直处在焦虑之中,...

  • 一些个想法

    1. 国庆了,想换个发型。两年多没做头发了,想去做一个,但又怕伤发,也不知道哪里做头发好。 2. 小哥哥下周可能就...

  • 那些个

    跳祭舞的神女身姿曼妙 虔诚的信徒焚香祷告 诵经的高僧修行道高 说那些个什么崇高荣耀 不过是戴上了 虚伪的形式面具 ...

  • 独自

    不管你相不相信 我会一直一直都记得 那些个为你伤心难过 那些个想起你就觉得寂寞 那些个那些个没有人在夜晚 我害怕彷...

  • 关于面试的一些个人看法

    关于面试的一些个人看法关于面试的一些个人看法

  • 一、容器

    (1)容器分类 <1>顺序容器(序列容器) <2>关联容器 <3>容器适配器 (2)vector容器 <1>概念 ...

  • 一些个人经验

    抱怨在绝大多数时间没什么用。 “死亡是一件不必着急的事”——史铁生 生病很难受 话不能抢着说,要先多听别人怎么说,...

  • 那些个井窟窿 (一)

    回到乡村老家,没事时独自溜达到村外,信步那片曾经很熟悉的田野的沟沟坢跘,峁峁梁梁,觉得分外亲切熟稔。树木——尤其是...

网友评论

    本文标题:一些个容器

    本文链接:https://www.haomeiwen.com/subject/webhlrtx.html