Java面试:备战金九银十,快问快答第一期
总有朋友担心面试要准备到什么程度才能有信心。这次就来拿一位朋友真实的Java面试经历,来一次快问快答,看看你能坚持到哪一个。
Java面试快问快答
- Spring Boot 和 Spring Cloud 有什么区别?
简单说,Spring Boot 是为了让单个应用开发更简单,它整合了各种常用的Spring系列框架,主打一个开箱即用。Spring Cloud 是基于 Spring Boot 的微服务治理框架,负责管好注册中心、配置中心、服务调用这些分布式的事。
- HashMap 的底层原理是什么?
- 底层是数组加链表的结构,JDK 8 之后为了优化,链表过长会转成红黑树。
- 它通过 key 的哈希值快速定位到数组位置,如果位置上已经有数据了,就挂在后面的链表或红黑树上,一般查找和插入都是常数级的效率。
- 关于Spring 里的 AOP,谈谈你的理解。
- AOP 即面向切面编程,把通用逻辑(如日志记录、事务管理、权限校验等)从业务代码中提取出来放到切面中,通过动态代理,在方法执行前后插入这些逻辑。
- BIO、NIO、AIO有什么区别?
他们都是Java中常用的I\O模型。
BIO是阻塞式IO,会一直阻塞线程等待操作完成。采用一个线程处理一个请求的方式,面对高并发时线程数量增多,容易导致系统崩溃。
NIO是非阻塞式IO,IO线程可以去做其他任务,当IO操作完成时收到通知回来和处理。采用多路复用来监听多个客户端请求,减少线程数量,提高系统性能。
AIO是异步非阻塞式IO,不需要用户线程关注IO事件,由操作系统通知回调机制处理。依靠操作系统完成IO操作,不需要额外的线程池或多路复用。因此对操作系统有要求。
- 如果一张千万级大表,访问速度变慢了,你的优化思路是什么?
首先,必须考虑加索引,这是最直接的。如果还不行,就上分库分表,把数据压力分散开。同时,把访问最频繁的热点数据,放进 Redis 缓存。最后,对不常用的历史数据做冷热分离,归档处理。
- MySQL 的隔离级别有哪几种?为什么线上常用‘读已提交’?
- 有读未提交、读已提交、可重复读和串行化四个隔离级别。
- 读未提交会出现脏读;读已提交解决了脏读,但会有不可重复读;可重复读解决了不可重复读;串行化最安全但性能最差。
- MySQL 默认是可重复读,公司一般用读已提交,因为它没有间隙锁,性能更好。
- 怎么设计一个分布式锁?你有什么思路?
有几种常见的方法:第一种用数据库,比如靠唯一索引实现悲观锁;第二种用 Redis,通过 setnx 命令加过期时间来实现,但要注意指令原子性。或者直接用Redisson封装好的锁;第三种用 Zookeeper,利用它创建临时有序节点的特性,天然就支持锁和自动释放。
- 如果 Redis 宕机了,怎么保证服务高可用?
上高可用方案。要么用主从复制加哨兵来监控和自动切换,要么直接上 Redis 集群模式,一个节点挂了会自动故障转移。但最关键的是,核心数据一定要做好持久化,同步到数据库,这是最后的保障,防止数据丢失
总结
金九银十不用慌,做好准备不迷茫。另有一百万字的面试八股,看完直接横扫面试,需要的朋友联系我获取。