题目和部分内容来源于:csdn学院-Java面试Offer直通车
1. 准备方式
错误的准备方式
• 只看智力,情商和算法题
• 准备项目描述时过于注重业务,忽视技术
• 就是论事准备技术问题,不向底层和调优方面扩展
• 万能简历到处投,不看职位介绍细节
• 面试回来后不复盘,不补充自己短板
推荐的准备方式
• 优先准备项目介绍,介绍项目时“随口”抛出技术点,引导面试
• 从Java核心,数据库,框架方面准备技术问题,更引导到调优方面
• 准备若干分布式组件和底层代码和排查问题案例的说辞
• 着重看职位介绍,了解公司的技术栈,对应准备,比如职务偏重业务,则关注技术全面,如职位需阿里系组件,则准备分布式组件
• 遇到没回答上的问题,从点到面准备,比如Netty堆外内存这个点,被问倒,则全面了解Netty细节,包括重要组件,流程等,并准备结合项目的说辞
2. 核心面试题目
2.1 集合
• ArrayList,LinkedList,Vector有什么差别?快速失效是什么?
• Set如何去重?TreeSet和HashSet有什么差别?
• HashMap里的hashCode和equals方法如何重写?
• 线程安全和线程不安全对象,如何把集合变成线程安全?
• Collection和Collections的差别?泛型里super和extends的用法
• 回答要点:回答后向HashMap和ConcurrentHashMap底层代码靠拢
2.2 异常处理机制
• 异常类的结构,RunTime异常
• 如何自定义异常?
• finally从句的用法
• 回答要点:说好以后,顺带说辞异常处理的最佳实践,比如尽量缩小异常影响的范围,缩小try…catch的范围等,再说出子类方法不该扩充父类方法的异常范围,顺带说出理由
2.3 面向对象和设计模式
• 面向对象的三要素是什么?你项目里用过哪些设计模式?
• 接口和抽象类的差别?
• 方法重载和重写的差别?访问修饰符的作用范围
• 写单例模式的实现方法
• 回答要点 1,比如接口和抽象类,结合项目回答 2 说出子类无法缩小父类方法可见性等细节 3 结合项目实际说出若干设计模式的实现 4 最后扩展到设计思想,比如单一职责原则等
2.4 多线程方面
• 如何创建线程?如何让线程有返回值?
• violate, synchronized,ThreadLocal的用法
• 有没有用过线程池?创建线程池的参数?
• 从notify, wait等问起,问如何管理线程并发?
• 线程间如何传递参数?
• 回答要点:1 引到线程内存模型话题 2 引出CountDownLatch等高级对象话题 3 引出Lock话题,并讲出可重入锁公平锁等话题 4引出线程池,ThreadLocal方面的内存泄露以及预防的说辞
2.5 虚拟机方面
• 讲一下垃圾回收的流程
• 讲一下虚拟机的结构,以及如何防止内存泄漏和OOM异常?
• 回答要点
• 1 从虚拟机结构讲到对象存储方式,再讲到GC流程
• 2 引出软引用和弱引用,结合项目说如何使用
• 3 讲出为什么会内存泄漏,以及如何预防?
• 4 通过案例,讲述分析和排查OOM的经验
• 5 有机会可以讲下内部类参数加final的话题
2.6 数据库方面
• 用过哪些数据库?用过哪些数据库调优的技能?
• 事务特性,事务隔离级别和事务传播机制
• 索引的结构,正确的用法,哪些语句无法用索引,复合索引和回表
• 开放性问题:数据库调优方面,有哪些经验?
• 回答要点
• 1 单机版的角度,从SQL语句,执行计划,索引方面讲调优经验
• 2 进一步可以讲MyCAT,redis之类的分布式数据调优经验
• 3 结合项目说明,同时结合案例讲排查和解决长SQL问题的经验
框架方面
• Bean的自动引入方式,IOC和AOP的特性
• Bean的生命周期,以及单例和prototype类型的Bean
• 从前端到后端,结合业务,讲下SSM框架的工作流程,比如请求如何被Controller处理,如何通过Mybatis返回,再如何返回到前端
• 回答要点
• 1 讲下Autowired的特性,讲只用到单例的bean
• 2 套到Bean的生命周期,以及对应的回调函数,酌情说重写过哪些
• 3 如何可以,讲下Spring Boot里的关键注解
分布式组件方面
• 初级开发用过就行,高级开发可以适当讲下细节
• Netty,MyCAT,Dubbo,Redis,kakfa,spring cloud组件怎么用的
• 内部细节,比如dubbo的服务暴露流程,netty的粘包和半包,这块对资深高级开发要求很高,但一般高级开发知道即可
• 回答要点
• 1 结合业务讲下你用过,哪怕用过API也行
• 2 结合案例,讲述解决问题的经验,比如如何通过日志和监控排查因dubbo超时而发的问题,
• 3 可以讲下参与压测,并根据压测结果调优的经验
软实力方面的问题
• 你项目里遇到过哪些技术难题?怎么解决的?
• 在项目里你遇到不会的技术怎么办?
• 举例说明你分析和排查各类(比如OOM)线上问题的经验
• 回答要点
• 1 遇到不会的,赶紧自己学,同时为了不延误进度,多问人
• 2 结合项目举例说明你有解决各类问题的经验
3. 常见笔试题
• 实现链表,双向链表等数据结构的问题
• 实现一个排序算法,或递归排序类算法
• 用ArrayList实现堆栈队列等,或实现ArrayList扩容
• 实践要点:多查相关题目,事先多写几遍