2018年社招面试记录(2017年毕业,算一年半经验吧)
目录
面试记录
面试知识点总结
面试经验
面试收获
微医:
聊聊你做的项目,主要负责什么?
项目是怎么部署的?用到了哪些命令?线上出了问题都是怎么解决的?
linux如何查找一个字符串出现的个数?
spring mvc流程说一下,项目启动时servlet做了些什么?
有哪些参数注解?有哪些bean注解?
@Autowrite和@Resource区别说一下
Hash碰撞怎么解决的?
concurrentHashMap如何实现线程安全?
AtomticInterger如何实现的?
你在项目里redis是怎么用的?
Es分词怎么分的?
说一下JVM分区
说一下GC
哪些可以作为GC Root?
OOM溢出有哪些原因?如何判断?
rpc了解吗?
你用过哪个MQ?
一面:
笔试题,自定义一个异常类,异常时发送邮件,但是五分钟内只能发送一次,如何实现?考虑到线程安全又该如何改进?
Http 请求几部分?都包含什么?
几种排序时间复杂度(归并)
说几个Tomcat和Jvm调优参数?具体怎么操作?
说一下NIO
Full GC频繁 stop the world怎么处理或避免?
说一下MQ吧,自己搭过吗?
你都是如何保证代码规范的?
在编程上有什么心得?那几个原则要理解
如何对系统性能进行提升?
从cdn,负载均衡,es,redis,数据库设计,db缓存,mybatis缓存,索引,Sql优化说了一下。没说分库分表和读写分离。
自己平时怎么学习的?
二面:
pv面试,就一道题。
一个txt文件,里边一行一个手机号,判断一个电话号码在不在里面,怎么做,用最佳方式实现?
这道题真的没get到考点在那磨叽了半天
说一下做的项目,都用了什么技术?
设计模式说几个,然后问你都用过哪些
我说用过单例,然后问双重检查机制实现单例模式对象为什么用volatile修饰
然后又让说一下volatile应用场景
消息的应用场景说一下
你们系统登录是怎么实现的?
线程池创建方式说一下,几个参数什么意思?newSingleExecutor怎么用?
索引底层是什么?索引如何实现的?
线程间如何通信?然后接着问有什么区别?
Java读写锁说一下
数据库如何提高性能?
说一下dubbo
Spring如何实现事物的?具体怎么操作?
事物传播机制说几种
一面:
笔试一:写个单例
说一下为什么你这个单例是可靠的,顺带问了一下volatile
笔试二:乱序字母的一个字符串按ABC排序
画一下jvm内存图(1.7之前的就行)
什么情况下从新生代到老年代?
三个对象互相调用形成闭环,会gc吗?
gearman是个什么东西?
es如何索引的?
说一些sql优化,索引使用,索引失效
说一下红黑树(这个问题是在问hashmap的时候顺带问的)
二面:
问项目,聊人生
三面:
问项目,聊人生
二面之后还有个在线的价值观测试
笔试:
一个字符串,判断他是不是对称的(有空字符算作不对称)
你在第一个项目里负责什么业务?
画一下第二个项目的流程图
qps是多少?项目怎么部署的?
mysql,redis,es都开启多少个线程?请求时间设置了多少?
搜索模块你是怎么重构的?
你们系统的线上的jvm怎么设置的?
画一下线程状态转化图
ArrayList和LinkedList区别,ArrayList的底层,查找和删除最好和最坏复杂度,为什么?扩容说一下
说一下抽象和接口的
如何保证一个队列是线程安全的?
synchronized和lock的区别
failfast机制说一下
锁池
读写锁
写个快排
说一下aop实现原理,spring代理模式原理,如何在一个方法前后各输出一句字符串。
多线程循环输出ABAB。
countDownLatch说一下,可以用在哪些地方
创建线程方式,线程池。
如何自己实现一个阻塞队列
如何实现一个LRU cache(LinkedHashMap)
设计模式,框架应用,你实际使用过哪些?
设计一个秒杀系统,即可以应对高并发又可以防止机器刷还要保证数据准确(防止超卖)还要对服务器最小的压力。
可以从水平扩展机器,静态化资源,限流(有损服务),不直接操作DB,可以使用mq或redis缓解DB压力
笔试
三个运动员跑1000米,裁判员发令后同时开跑,输出各自跑完花费的时间
用java实现一个单向链表,实现put和get功能
用java模拟实现浏览器前进或后退功能
说一下类加载过程
说一下mysql索引如何实现的
redis如何持久化?什么场景使用哪个方式?
dubbo如何实现自动注册和发现的
一面:
三道笔试
求一亿个无序数里最小的1000个数,topN问题一般都有哪些思路?分治+堆排
两个有序数组求交集。(二分查找变一下就行)
一本书,求出现最多的字的次数。
Fork/Join
为什么要用spring?用自己的话说一下aop和ioc
aop如何工作的?
spring容器是干嘛的?让你自己写一个容器怎么实现呢
了解什么jvm监控工具?
如何查看一个应用线程?
你是怎么对消息进行优化的?
redis里用Map和String有什么区别?例如存储用户会话缓存
Rpc框架需要注意什么(协议,序列化,IO)
HashMap为什么不是线程安全的?
LinkedList与ArrayList区别?分析一下
如果让你实现一个RPC框架,你怎么实现?(代理-获参-系列化-tcp-nio-反射-序列化-返回结果)
二面:
说说你对移动端后台和javaweb应用后台理解。
版本兼容性你都怎么保证的?
你对接口都是怎么优化的?
需求可能导致现有接口不符合,怎么处理或避免这种事?
es内部机制说一下。节点,分片以及如何运作?
和mysql对比你有什么理解(他指的是es的分布式存储方式,不是倒排索引)
我要对1000万条数据进行操作,有什么处理策略?
MySql是如何与Redis同步的?出了问题怎么办?起个线程心跳执行是一种策略
说一下你项目里可以优化的地方
说一下你印象最深的一些解决问题的例子
三面:
写个程序反转字符串
画个项目或模块的流程图
说一下String,然后再说一下StringBuffer和StringBuilder
说一下抽象类和接口,为什么这么设计
说一下异常,运行时异常可以捕获吗?最大基类是什么?
hashMap put一个元素过程说一下,为什么不是线程安全的,会发生什么,concurrentHashMap get过程说一下,为什么是线程安全的?1.8之后做了什么改进?
为什么TreeMap是有序的,按照什么排序?
除了TreeMap还有什么是有序的?
hashTable说一下
sleep wait notify说一下
notify和notifyAll区别
说一下synchronized,有什么可以替代他的?
cas是什么?从原理上解析一下
volatile是什么?可以保证原子性吗?为什么?
指令排序说一下
内存屏障说一下
事物四个特性说一下
隔离级别说一下,间隙锁干什么的
git的merge和rebase什么作用?
linux命令查看cpu除了基本命令还有呢?
一道脑筋急转弯
两道算法题
字符串压缩,即aabbccc => 2a2b3c
循环数组查找,即5678123查找x
说一下你们系统用到的数据库表
算法:求一串数的最大连续子数组
算法:实现大整数加法
算法:n个有序数列获取最大m个数
用程序写个树
sql:找出工资大于部门平均工资的员工
简述aop ioc
一面:
说一下乐观锁悲观锁(不用管java的还是db的,思想都差不多,知道什么说什么)
信号量说一下
二面:
转账问题如何保证?分别说一下单库和分布式库(2PC,补偿事务TCC和本地消息表)事务
collections.sort内部使用什么算法排序的
算法:写个开方运算
1m的空间能不能保存100万个8位数?
垃圾回收过程从头到尾,从一个对象创建到销毁说一下整个过程
三面:
找各种刁钻的问题,压你的薪资
一面:
几种引擎的区别,索引实现原理
数据库如何保证一致性
JVM1.7和1.8有什么区别
cms回收器如何工作的?说一下四个过程,G1说一下,相比CMS有什么优势
spring mvc启动过程,哪一步可以做一些扩展(例如静态资源映射,拦截器,参数注入等)
二面:
说一下left join的原理(笛卡尔积 - on筛选 - join - where再过滤 )
抢购问题 单库和分布式情况下如何实现
linux的awk说一下,给了一道题忘了
一千万个数里取10个最小的数,用什么算法,堆排序,为什么用堆排序?
说一下堆排序的过程
三面:
问项目
一面:
类加载过程(主要问准备,类构造,实例构造阶段
说一下观察者模式
二面:
linux awk命令
es内部用的什么结构,一个插入过程中es里的节点以及分片是如何工作的
联合索引实现原理
Bean生命周期
三次握手
499状态码代表什么?
自己写过什么注解
spring boot相比spring mvc有什么优势
事务传播机制说一下,一般什么场景用哪个?
首汽约车订单表两亿条数据如何进行拆分?
可以水平拆分,最好分库,分库要优于分表(考虑资源)
从哪个角度拆分?
时间,城市, 或者 hashid ?
如何实现uuid?机器码+时间码+自增数
三面:
问项目
另外还有两家后面发现问的问题都差不多就没再做记录了
还会问一下网络,前端等方面的问题
一:Java
集合:
异常:
多线程:
《java并发编程的艺术》
JVM:
《深入理解JVM虚拟机》
NIO:
其他:
比如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里可能都会讲到,可以关联起来理解
二:深入理解,切记死背,要理解为什么这么设计,可以多看一些源码
三:多动手,比如几个线程框架,可以多敲几个例子验证一下
四:加深对项目的理解,不要只是了解自己负责的一个模块