zoukankan      html  css  js  c++  java
  • 源码分析: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。

  • 相关阅读:
    Linux内核的异常修复原理
    sudo: insmod: command not found
    在Qemu+ARM上运行Minix3内核
    2021.34 面对干扰
    2021.33 实践
    selenium+python自动化106
    python测试开发django-111.模型管理器(models.Manager)
    python笔记64
    python笔记63
    python笔记62
  • 原文地址:https://www.cnblogs.com/1185937986-jili/p/12897542.html
Copyright © 2011-2022 走看看