• 源码分析:LinkedList/ /源码分析:JDK1.7的HashMap


    LinkedList:
    1.内部实现:链表
    记录Node first
    Node last

    2.add(xx)
    默认添加到链表的尾部linkLast(xx)

    3.add(int index,xx)

    4.remove(xx)

    JDK1.7及之前:HashMap的底层实现是数组+链表。

    (1)数组的元素类型是什么
    Map.Entry接口的类型(key,value)
    HashMap.Entry内部类类型,实现了Map.Entry(key,value,next)

    (2)为什么要有链表
    计算每一对映射关系的key的哈希值
    然后根据哈希值决定存在table数组[index]

    情况一:两个key的哈希值一样,但是equals不一样,最终计算的index相同
    情况二:两个key的哈希值不一样,equals也不一样,但是通过公式运算后,index相同。

    那么table[index]中无法存放两个对象,所以只能设计为链表的结构,把它们串起来。

    (3)数组的初始化长度是多少?
    初始化长度默认为16
    如果手动指定,那么也必须是2的n次方,如果不是会自动纠正。

    (4)数组是否会扩容?

    什么情况下会扩容?
    有一个变量threshold达到临界值时,就会考虑扩容,还要看当前添加(key,value)时,是否table[index]==null,如果table[index]!=null那么就会扩容,如果table[index]==null,那么本次先不扩容。

    DEFAULT_LOAD_FACTOR:默认加载因子为0.75
    threshold = table.length * 0.75
    第一次:16 * 0.75 = 12,当我们size达到12个,就会考虑扩容。

    (5)index如何计算?
    拿到一个key的哈希值之后,如何计算[index]
    (1)key是null,固定位置[index] = [0]
    (2)第一步,先用hashCode值通过hash(key)函数得到一个比较分散的“hash值”;
    第二步,再根据“hash值”与table.length做运算得到index
    hash & table.length-1按位与 确保index在[0,length-1]范围内。

    (6)如何避免key不重复的?
    换句话说,如果key重复了,会怎么办?

    如果key相同,那么我们会替换旧的value
    key相同:先判断hash值,如果hash值相同,判断key的地址或equals是否相等。

    (7)新的(key,value)添加到table[index]后,发现table[index]不为空,怎么连接的?
    (key,value)是作为table[index]的头,原来下面的元素作为我的next。

  • 相关阅读:
    实现一个简单的Http代理服务器
    微软的反向代理库YARP
    Elastic Search 基础——分析(Analysis)
    Elastic Seach基础—映射(Mapping)
    使用WebView2在.Net程序中集成Edge chromium
    Asp.net Core中实现自定义身份认证
    在Razor Pages的Url中增加扩展名后缀
    利用Aria2构造自己的下载工具(一)
    Mongodb中GUID的显示问题
    在Eclipse中使用MAT分析Android程序内存使用状况(转)
  • 原文地址:https://www.cnblogs.com/1185937986-jili/p/12897542.html
Copyright © 2020-2023  润新知