![da0d6558b651f6184c33a80cd59c638b.png](https://i-blog.csdnimg.cn/blog_migrate/8cc8555be2680e49bbc2939b6ca9443a.jpeg)
面试知识点总结
一:Java
集合:
hashmap和concurrenthashmap源码一般必问,最好看1.8版本的,ArrayList和LinkedList区别,TreeMap和LinkedHashMap区别以及原因(就是问底层用的什么数据结构实现的)?
还有一些juc下的,queue,stack等十几种常见的接口或实现类要了解实现原理以及使用场景
异常:
了解整个异常体系Throwable,error,exception,RuntimeExceptiion,以及检查时异常。
一个比较常见的考点:try-catch-finally(1,finally一定会执行,2,返回值是在finally之前确定的然后会存起来,3,return的优先级是finally > catch > try。所以finally中放return会提前退出)
多线程:
知道线程的几个状态,以及可能是什么原因从一个状态变为另一个状态
线程池几个参数以及各个意义,线程池接受一个任务为什么设计成这样?(因为在队列里不需要获取全局锁)
synchronized,理解原理,锁是加在对象上的,但是要靠monitor判断。volatile可见性,防止指令重排序(指令的happens-before要知道)
CAS,AQS原理以及在哪些地方使用了他们?深入理解一下,整个并发体系的好多实现类基本就是靠他俩了
Lock ReentrantLock Condition ReadWriteLock
原子类的实现原理,juc下的并发容器
要会使用一些并发框架,例如:Fork/Join,countDownLatch,信号量,线程屏障
《java并发编程的艺术》
JVM:
各个区是干什么的,从一个类加载,实例化,调用执行某个方法,到对象被回收整个过程要明白流程,以及涉及到的数据在各个区之间的转换
GC算法,垃圾回收过程,收集器以及区别
要知道1.7和1.8的区别,目前网上的资料大多是针对老版本的JVM
《深入理解JVM虚拟机》
NIO:
何为非阻塞IO
selector,channel,buffer
NIO用处或优势,Netty要知道,TCP或RPC框架方面可能牵扯着会问到
其他:
比如Java为什么是多态的,依靠什么来实现的?为什么要设计泛型这个东西?jdk不同版本加了哪些些东西?还有stream,枚举,序列化等等
二:数据库
InnoDB,MyISAM区别,知道索引实现原理以及为什么这么实现(例如聚簇索引是什么东西,二级索引为什么是要用B+树结构的)
了解sql执行过程(join 或 where连表 以及使用索引),这样可以更好的进行sql优化
数据库事务,比如ACID(用redo和undo机制保证原子性和持久性,锁或多版本保证隔离性,'AID'共同保证'C'一致性),其中锁(悲观)又会按照使用方式和粒度进行划分
explain
三:Spring
为什么用spring?(有什么好处)
spring启动过程(启动过程中serlvetcontext webapplicationcontext dispatcherservlet都会做什么)
生命周期(配置文件里的init-method和destroy-method方法,BeanNameWare,BeanFactoryWare,InitiazingBean,DiposableBean接口,BeanPostProceossor后置处理器实习类要知道他们的作用和执行顺序)
作用域
aop是怎么实现的,jkd代理和cglib什么区别
aop实现事务和传播机制具体配置以xml为例简单描述一下
springboot和apringmvc的对比
四:算法和数据结构
算法:常见的排序(面试的时候最好不要写冒泡这种高复杂度的),查找算法以及每种的时间空间复杂度,给你一串数要写出了接下来几步的变化
链表插入,反转,删除等
树的前序、中序遍历,或者是按照递归和非递归(那就是迭代了)方式,或者是按照深度广度优先级分。求树的最大(小)深度,查找节点等操作
五:linux
查看内存,cpu,硬盘,进程。每种命令的结果比如ps的pid id分别是什么
文件命令,权限命令
查看日志相关操作,比如grep 管道 set tail head等命令,查看多少行到多少行的?查看某个字符串个数出现个数?
或者更复杂的需要awk的,首汽约车和vipkid问了两次
linux如何开启一个任务?如何开启mysql主从复制功能?等等
六:Git,Maven等开发工具
比如常见的一些问题:rebase和merge区别?stash什么作用?你们项目是如何做代码管理的?jar包冲突怎么办?如何不加载重复的jar包?
七:各种中间件和其他技术
es肯定会问系统怎么用的,如何分词,脑裂等问题。有两家问过es实现原理
redis肯定会问怎么用的,还会一些主从分离,数据持久化,incr,实现分布式锁等问题。
rpc(包括dubbo,springcloud,grpc)至少会一样,会问怎么用的(好处以及如何配置),有一家还问了自己怎么实现一个类似dubbo的框架(实现方式:一般请求方通过动态代理,JDK里的Proxy。通过重写Proxy InvocationHandler接口里的invoke方法实现。这个环节获取方法名,参数,返回类型,并且序列化参数。之后一般使用tcp进行网络传输,服务端一般使用同步非阻塞的NIO框架例如netty进行数据接收。服务端接受到请求中的方法和参数后通过反射调用真实的方法。然后将返回值序列化封装返回给客户端。)
kafka,jekins等
八:项目
简历上出现的项目都会问
口述一下项目的业务,可能会让你画个时序图,模块图之类的,然后可能会抓住某个模块问细节实现。
项目涉及的配置也会问,比如用的什么连接redis?事务怎么配置的?隔离机制是怎么样的?db怎么备份的?es用了几个type?日志怎么配置的?日志文件放在哪等等
九:必考的两道题:
单例模式和设计一个秒杀系统。每一道都被问过多次。单例考察基础,秒杀系统考察知识面(宽度)和经验
一道由单例引发的面试经验:https://www.cnblogs.com/xiexj/p/6845029.html#4082170
面试经验
简历要认真写,不会的不要出现在简历上,不会比说错要好
好的公司一定要留在后面投,可以先面几家,面试个十几天和没面试之前差距是很大的,起码在应对面试上。这点在毕业不久同学身上最明显。
不要等到你准备好了也过了招聘季了,淡季不好找,所以一定要提前准备。尤其是毕业不久的同学,在找工作难度和准备时间都没优势。
面试收获
一:知识体系化,不要分散要打通,比如synchronized这个关键字,单独讲多线程和JVM里可能都会讲到,可以关联起来理解
二:深入理解,切记死背,要理解为什么这么设计,可以多看一些源码
三:多动手,比如几个线程框架,可以多敲几个例子验证一下
四:加深对项目的理解,不要只是了解自己负责的一个模块