一、Java基础
1.1、基础知识
1.1.1、int Integer区别
1.1.2、wait sleep区别
1.1.3、gbk转utf-8
1.1.4、接口和抽象类区别
1.2、并发编程
1.2.1、volatile底层实现
1.2.2、synchronized与lock底层实现,区别
1.2.3、公平锁 非公平锁
1.2.4、cas
1.2.5、线程池
1.2.6、juc并发包
1.2.7、锁的升级
1.2.8、ThreadLoacl如何实现的线程隔离
1.2.9、ForkJoin如何实现的线程合并
1.3、jdk源码
1.3.1、HashMap&ConcurrentHashMap
1.3.1.1、数据结构
1.3.1.2、put流程
1.3.1.3、两者区别有哪些
1.3.1.4、1.7和1.8版本区别有哪些
1.3.2、几种常见集合类的区别
1.4、设计模式
1.4.1、手写线程安全单例模式
1.4.2、项目中用到的设计模式
1.4.3、六种面向对象设计原则
1.5、JVM
1.5.1、垃圾回收
1.5.1.1、可达性分析算法
1.5.1.2、常见的垃圾回收算法
1.5.1.3、垃圾收集器
1.5.1.4、垃圾收集过程
1.5.2、内存模型
1.5.3、oom问题如何排查
二、框架
2.1、Spring
2.1.1、IOC&AOP原理
2.1.2、循环依赖问题
2.1.3、普通对象和Bean的区别
2.1.4、说说看过的相关源码
2.2、Mybatis
2.2.1、常用标签
2.2.2、底层调用流程
2.2.3、插件原理
2.3、SpringMVC
2.3.1、底层调用流程
2.4、SpringBoot
2.4.1、看过的源码
2.4.2、和Spring的区别
2.5、SpringCloud
2.5.1、看过的源码
2.5.2、sentinel和hystrix的区别
2.6、Dubbo
2.6.1、dubbo有几种降级策略
2.6.2、dubbo都有哪些协议
三、数据库
3.1、MySQL
3.1.1、索引结构及为什么要用这个结构
3.1.2、索引失效
3.1.3、sql优化
3.1.4、索引类型
3.1.5、分库分表策略如何优化能减少数据转移
3.1.6、事务隔离级别及底层实现
3.2、Redis
3.2.1、数据类型
3.2.2、项目中如何使用的
3.2.3、持久化策略
3.2.4、淘汰策略
3.2.5、性能问题排查及优化
3.2.6、redis做分布式锁
3.2.7、如何保证原子操作
3.2.8、底层数据结构
3.2.9、哨兵模式和Cluster模式的区别
四、分布式
4.1、Raft协议
4.1.1、选举流程
4.1.2、数据同步流程
4.1.3、项目中遇到的问题
4.2、Nginx
4.2.1、项目中的使用
4.2.2、使用时配置文件中的关键字是什么
4.3、分布式和集群的区别
五、消息队列
5.1、RabbitMQ&Kafka
5.1.1、区别
5.1.2、项目中的使用
5.1.3、如何保证消息的可靠性(不丢失、不重复)
六、搜索引擎
6.1、Es和Solr区别
七、容器化
7.1、Docker
7.1.1、项目中的使用
7.2、K8s
7.2.1、基本概念
八、Linux
8.1、常用的命令
8.2、如何排查性能问题
九、算法
9.1、跳台阶
9.2、求开方
9.3、判断链表有环
9.4、链表去重(空间O(n),时间O(1))
9.5、数组取交集
9.6、两个大文件取url交集,小内存机器
9.7、斐波那契数列
9.8、两个栈实现队列
9.9、栈 取max 时间O(1)
9.10、指定题目
给出一个数组,数组的元素为整数,想对这个数组进行拆分,使拆分之后的数组元素之和接近N,如数组[19,17,16,1,2,1,2,3,4],使拆分之后的子数组之和接近或等于20,输出拆分之后的数据列表
十、网络协议
10.1、Http
10.1.1、http是纯文本协议吗
10.1.2、报文都有哪些内容
10.1.3、后端怎么知道一个请求过来是ajax还是其他请求
10.2、Https
10.2.1、调用流程(详细)
10.3、Tcp
10.3.1、为什么要三次握手四次挥手
10.3.2、如何保证传输过程的可靠性
十一、其他
11.1、领域驱动设计
11.2、敏捷开发
十二、总结
以上是本人在2021年3月跳槽过程中遇到的真实面试题,能想起来的都整理在上面了,只是一个大纲,当然面试官会结合简历和项目来提问,每个问题具体问到多深,会延展到多广,就看你怎么聊了。
这次跳槽面试最大的感觉就是各家公司对Java基础还是非常看重的,无论是几年经验,面的是大厂还是普通公司,基础这些东西还是要好好准备准备。当然这里说的Java基础,包括了常问的jdk源码、并发编程、JVM这些。而且大厂必考算法,我的算法比较弱,虽然也偶尔在leetcode上刷题,但毕竟算法这方面之前没太重视,还是吃了不少亏。
另外简历中写的技术栈,不管项目中是否用过,一定至少是自己研究过再往简历上写,不然就是给自己挖坑。例如,简历中写了消息队列相关的技术栈,面试官一般会结合项目来问,首先看你有没有用过,具体是怎么用的,如果你在项目中没有用过,只是自己研究过,也一定要自己想个场景,并且给出思路来跟面试官聊,证明你虽然没有用过,但如果未来的工作中有需要,你是可以胜任的。
对于某一项技术,会不会用只能表示你能不能用它干活,对于一个有经验的开发人员,快速入门一项技术是必备能力,这不是加分项。加分项是你有没有对某一个技术有过深入了解,能不能在面试的过程中,把你深入了解这项技术时掌握的学习能力给体现出来。如果面试官认为你的学习能力出众,并且有较强独立思考的能力,有什么难题你都有一套自己的方法论来解决,那你就有资格来谈薪了。
平时多积累、多总结,总是没坏处的,我从去年年底开始写博客,虽然写的不多,质量也比较水,但每一篇博文对我自己来说都是一个归纳总结的过程,所以这次面试比较顺利。
平时工作中注意通过解决问题来对一项技术积累深度,工作之余开阔视野来积累技术广度。当能够感觉自己进步的时候,是会对学习上瘾的。