Java面试题杂选

面试题杂选

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实现分布式锁

集群中的定时任务问题

springboot循环依赖

mq如何保证消息不重复、不遗漏

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 3
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值