一面 1. String、StringBuilder、StringBuffer的区别2. String不可变的原因是什么3. 常用的String方法4. 浅拷贝和深拷贝的区别5. 项目介绍和主要职责6. 线程池调参、线程池隔离7. 线程池核心参数以及意义8. 核心线程数的作用以及创建时机9. redis防重机制的设计原因10. 使用的redis的类型11. redis的string底层设计12. 分库分表改造13. 分库分表改造时要注意的问题14. 分库分表涉及的数据迁移15. 本地缓存使用场景16. 数据库不一致问题17. 库存扣减的其他方案18. 博客上的问题19. sql调优经历20. 什么是覆盖索引21. 索引类型有哪些22. B+树做索引的特点23. 索引失效的场景24. 项目还有哪些亮点没有问到?25. 第二个项目的介绍26. 高jdk版本的新特性27. jdk8的stream语法28. java集合的分类29. 集合存储null值的情况30. HasMap的底层原理31. 单例设计模式手撕:删除倒数第n个节点反问建议:尽量不要一问一答,自己多去延申思考二面1. 项目一共几个模块、一共几个人2. 项目遇到的挑战以及如何解决3. 项目遇到了什么问题4. 分布式锁加锁解锁的原理5. 锁的过期时间的设计6. redis过期淘汰策略7. redis相较于mysql的优势8. redis为什么快9. 线程池参数调优,限流和降级10. HashMap如何更新一条数据11. JVM垃圾回收中的新生代老年代的回收策略12. 新生代的划分、复制回收的具体过程手撕:最长公共前缀13. 个人优缺点