华为OD面试前准备以及对自己得总结
网上看了一下各位前辈面试的帖子,大概整理一下问题: 1.八股文基础 HashMap HashMap 散列表 , 键值对数据结构,查询轻松,插入消耗大。 1.7针对碰撞引入了 链表 ,这样解决了key值计算hash相同的问题。1.8引入红黑树,当链表长度超过8且数组长度超过64,链表将转换成红黑树进行存储。HashMap 定位是按照(n-1)& hash(key)(取余)进行定位,其中计算hash值是将key的hash值右移16位异或原key hash值获得hashcode; 为什么引用ConcurrentHashMap 也是 HashMap为什么是非线程安全的 1.7中 多线程情况下进行扩容,可能会有循环链表产生,在访问到该链表数据时会导致死循环 1.8中 在对多线程对size++时,会出现数据覆盖的问题; ConcurrentHashMap ConcurrentHashMap 分段保存数据,并对每一段数据进行加锁,这样避免锁整张散列表,提高了效率。 1.7中使用ReetrantLock进行加锁, 在put时不断trylock 自旋,在达到上限64次时会使用阻塞锁 1.8中主要使用synchronized 和 cas进行同步 其余八股文自行掌握
2.mysql优化
数据库设计优化 单行数据不能过长,mysql单行数据最大16kb,原因是单个数据页只有16kb大小。单行数据过大会导致 单次读取数据量更少,在查询数据时需要将磁盘数据读取到内存进行检索,每一次io非常耗费时间,如果单行数据过长,则可能需要进行多次io才能完成检索,因此在设计数据库时,字段长度大小一定按需分配,为保证容错可增加一点大小。
索引优化 为什么不使用 select*,因为必须通过聚簇索引去查到所有数据,无法只通过辅助索引获得数据,有回标得消耗。 覆盖索引,只从辅助索引要数据。那么, 普通索引(单字段)和联合索引,以及唯一索引都能实现覆盖索引的作用。 explain 执行计划分析
数据分区(拆分) 数据分区?
垂直拆分 单表变多表优点,
垂直分表 需要考虑关联性,要尽量做到拆分之后不影响业务流程
水平拆分 不同数据根据算法,分配到不同表中
3.redis redis五种数据类型以及格子特点,其他公司面试有被问过有关bitmap,zset设计题。 redis持久化 redis常见问题 ,如何解决或者避免雪崩,击穿,穿透 redis哨兵模式 redis底层 为什么redis单线程但是为什么这么快。 首先基于内存,使用多路复用io,单线程也使其不用进行频繁得上下文切换。
4.springboot 该部分仍然有所欠缺,需要钻研下。
5.项目深入 了解自己的项目,考虑自己在项目中用到得技术,考虑自己在项目中得角色,考虑项目得优化问题, 回顾项目中遇到的有价值的问题