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/c3633291ecda
  • https://blog.csdn.net/wanderlustLee/article/details/80747860
  • https://blog.csdn.net/wdyliuxingfeiyang/article/details/109162150

2.MySQL索引数据结构

MySQL中是使用B+树作为索引。它是B树的变种,因此是基于B树来改进的。

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

参考文章:

  • https://cloud.tencent.com/developer/article/1543335

3.索引失效的情况

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

参考文章

  • https://cloud.tencent.com/developer/article/1704743
  • https://blog.csdn.net/guoxingege/article/details/51034387
  • https://segmentfault.com/a/1190000021464570

4.最左匹配原则(abcd联合索引,查bcd可以吗)

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

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

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

参考文章

  • https://cloud.tencent.com/developer/article/1833688
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值