• Java集合HashMap,List底层


    集合:

    java.util包下的集合类 都是 fail-fast 快速失败的

    如果多线程并发使用都是造成 并发修改异常

    java.util.concurrent 包下都是 fail-safe 支持并发的

    ArrayList 初始大小10  扩容每次1/2

    ArrayList 默认初始化是0  第一次add()后变成10

    ArrayList 指定初始化大小后 只是里面的数组制定了大小 size还是0,因此set()会报数组越界

    ArrayList 插入某个元素,原理是 复制一份该元素index位置到末尾的一个数组,然后把新数组加到原来数组index+1之后的位置,index的位置再放入新元素

     删除某个index位置元素,原理是  复制index+1以后的一个数组,再从index位置覆盖原来数组

    Collection.SynchronizedArrayLists 就是在ArrayList基础上套一个synchronized

    ArrayList不适合做队列  总是复制迁移 耗费性能

    数组适合做队列  ArrayBlockingQueue原理就是定长数组

    ArrayList因为内存连续 因此遍历很快

    HashMap<K,V>

    数组加链表  

    put(k,v)相当于 新增一个Node<k,v>节点

    然后对K进行HASH取模算出HASH值 存入对应index的数组

    相同HASH值的 就形成了一个链表

    初始大小16

    负载因子  0.75   当达到负载因子时  除法扩容

    给初始化值是 尽量保证2的幂  以

    扩容:创建⼀个新的Entry空数组,⻓度是原数组的2倍。

    ReHash:遍历原Entry数组,把所有的Entry重新Hash到新数组。

    java8之前是链表是头插法,

    缺点: 新加入的节点都插在链表头部  多线程操作 扩容时会改变链表上的顺序 容易导致循环链表(A节点的下一个指向BB节点的下一个指向A) 遍历造成死循环

    使用尾插不会导致扩容链表顺序改变

    红黑树;

    规则

    每个节点要么是红色要么是黑色

    根节点是黑色,

    所有叶子节点是黑色,

    根节点到叶子节点不能有两个连续的红色,

    任意节点到其叶子节点包含相同数目的黑色节点

    如果增删改时破坏了规则  红黑树会通过变色和旋转来达到自平衡

    java8以后HashMap结构为数组+链表,当链表长度大于8时 结构变为数组+红黑树

    当缩减小于6时  重新变为数组+链表

    HashMap ⽆法保证上⼀秒put的值,下⼀秒get的时候还是原值

    HashTable单纯是在HashMap上加了synchronized 并发效率很低,

    SynchronizedMap 初始化时会传入一个Map 和 一个Object(用来当锁)

    然后Map执行的每个方法  都套了一层synchronized 来保证线程安全

    ConcurrentHashMap

    未完待续。。

  • 相关阅读:
    Eclipse配置问题
    什么是SpringMvc
    【转载·】Linux yum 安装 gcc 、gcc-c++
    【转载】linux下安装wget命令(sftp实现法)
    [原创]关于javax.servlet.ServletException: File [&#47;loginController&#47;getVerifCode.jsp] not found异常 解决方案
    【转载】spring boot 链接 虚拟机(Linux) redis
    【转载】spring-boot 项目跳转到JSP页面
    [原创]Linux 下 redis 链接一次
    Linux 下安装 redis 详情
    [转载]CentOS 7虚拟机下设置固定IP详解
  • 原文地址:https://www.cnblogs.com/ttaall/p/13661461.html
Copyright © 2020-2023  润新知