面试题杂选
hashmap put流程
1. 先判断是否需要扩容
2. 根据key生成对应的hashcode,然后通过hashcode再一次生成需要保存的数据下标
获取对应下标的数据,如果为空,直接覆盖
3. 如果不为空,判断数据key是否存在,存在直接覆盖
4. 不存在,判断是链表还是红黑树的数据类型
5. 链表,遍历链表进行插入,长度大于8,转换成红黑树进行插入
6. 最后判断容量是否达到阈值,判断是否需要进行扩容
hashmap 将10个key,value数据放在同一个数组中
- 自定义hashmap的key,重写hashcode()和equals()方法
维护一个指定长度为100的缓存数据,新数据来就淘汰旧数据,且保证高效获取数据
- LinkedHashMap
- redis
synchronized 和lock的区别
synchronized
- 自动释放锁
- 不会产生死锁
- synchronized 是jvm提供的关键字,是一个重量级的锁
- 可重入 不可中断 非公平
- 分对象锁和类锁两种情况
lock
- 需要在finally中手动释放锁
- 可能会引起死锁
- 一个接口类
- 可重入 可中断 可公平(两者皆可)
- 一般使用ReentrantLock类做为锁
synchronized 类锁和对象锁
公平锁和非公平锁
threadlocal
慢sql怎么判断
主键索引 非主键索引
主键索引:又叫聚簇索引 索引列中包含了数据的索引
非主键索引:其它的索引都可以算作是非主键索引
查询回表和索引覆盖
mvcc
mysql 悲观锁和乐观锁
mybatis 接口和xml文件如何关联
数据库和缓存的一致性
redis淘汰策略
分布式锁实现原理
1. 基于缓存实现分布式锁
- redis 命令 1.setnx命令 2.expire 3.del命令 (1.setnx和expire分2步执行,非原子操作;若setnx执行成功,但expire执行失败,就可能出现死锁
2.delete命令存在误删除非当前线程持有的锁的可能
3.不支持阻塞等待、不可重入)
- redis lua脚本
2. 基于数据库实现分布式锁
- 基于mysql数据库表,唯一索引、采用排他锁加版本号 : SELECT * FROM table_name WHERE ... FOR UPDATE
- 基于mongoDB findAndModify原子操作
3. 分布式协调系统
- 基于zookeeper实现分布式锁