乐趣区

关于java:Java面试八股之每日5问01

1.HashMap 底层 + 扩容

  • JDK1.8 的 HashMap 的底层是数组 + 链表 + 红黑树,产生 hash 碰撞采纳拉链法解决抵触。数组中寄存的是链表。链表的每一个节点是一个 Entry,每个 Entry 中寄存了 Key,Value,hash 值,还有指向下一个元素的援用。
  • 当 hashMap 中的元素个数超过 [数组大小 * 负载因子],并且新的 Entry 落在了非空的地位,就会进行数组扩容,将会创立原来 HashMap 大小的两倍的数组,将原来的对象放入新的地位上。默认状况下,数组的大小为 16,负载因子的默认值是 0.75。
  • 须要留神的是,hashmap 扩容的判断,不肯定是数量占比超过 0.75 就会扩容,如果初始数组 16 的时候,直接插入 8 个 hashcode 一样的不同的元素,此时链表并不会转换成红黑树,而是 扩容,直到容量至多扩容到了 64。

参考文章:

  • https://www.jianshu.com/p/c36…
  • https://blog.csdn.net/wanderl…
  • https://blog.csdn.net/wdyliux…

2.MySQL 索引数据结构

MySQL 中是应用 B + 树作为索引。它是 B 树的变种,因而是基于 B 树来改良的。

  • B+ 数的个性

    1. B+ 树索引的所有数据全副存储在叶子节点,并且数据是依照顺序排列的。
    2. B+ 树非叶子节点上不存储数据,仅存储索引。
    3. 因为数据是依照顺序排列的。所以 B + 树在 范畴查找,排序查找,分组查找以及去重查找 这些操作上效率很高。

参考文章:

  • https://cloud.tencent.com/dev…

3. 索引生效的状况

  1. 如果条件中有 or,即便其中有条件带索引也不会应用(要想应用 or,又想让索引失效,只能将 or 条件中的每个列都加上索引)
  2. 对于多列索引,不是应用的第一局部(第一个),则不会应用索引(最左前缀准则)
  3. like 查问以 % 结尾
  4. 如果列类型是字符串,没有加单引号会导致生效
  5. 如果 mysql 预计应用全表扫描要比应用索引快, 则不应用索引
  6. 索引列上做计算、函数、类型转换等操作

参考文章

  • https://cloud.tencent.com/dev…
  • https://blog.csdn.net/guoxing…
  • https://segmentfault.com/a/11…

4. 最左匹配准则(abcd 联结索引,查 bcd 能够吗)

  • 最左匹配准则就是指在联结索引中,如果你的 SQL 语句中用到了联结索引中的最右边的索引,那么这条 SQL 语句就能够利用这个联结索引去进行匹配。

5. 数据库并发事务产生的问题

  • Read uncommitted 读未提交
  • Read committed 读提交
  • Repeatable read 反复读
  • Serializable 序列化

参考文章

  • https://cloud.tencent.com/dev…

如有侵权请分割删除

退出移动版