Java研发面经

个人情况:双非一本 2019届本科
岗位:Java研发
本次整理面经的面试时间周期:2020年4月——2020年7月

自己在每次面试后都整理了下来,分版块去说常问的问题,挨个学习突破的办法。

公司一 线下面

一面 (一小时)

1、自我介绍。

2、说一说你在工作中常用的框架。
我的回答:用的最多的是Spring社区的技术,常用的OR框架、Redis、JVM也会一些。

3、那你知道Spring的IOC和AOP吗?说一说。
我的回答:Spring框架的核心出发点为应用程序提供一个基础的可运行的环境为目标,所以最核心的东西就是IOC。回到最原始的Spring创建过程,是用一个上下文对象创建来开始的,扫描所有的xml文件,并且解析。最重要的是bean标签,解析这个标签之后得到一个很详细的BeanDefination,然后注册到BeanDefinationMap中去,而Bean工厂就持有了这个Map,用它就可以来进行IOC的创建,当然Sping不止创建了Bean工厂,还会实例化所有的单例Bean,其实常说的IOC容器就是这个singletonObjects的Map,也叫一级缓存,然后Spring还为这些单例bean设置属性的注入,还利用三级缓存解决了循环依赖的问题。(这里我说了好多,他一直都有反馈,然后连AOP都没有问我,就过了)

4、数据库优化你怎么想的
我的回答:主从、数据表的水平垂直拆分,索引建立和使用。后面连着问了好多数据库的问题。

5、Hibernate和MyBatis的区别
我的回答:我就简单说了一下,MyBatis的sql需要自己写,Hibernate一般不用不用写,mybatis的优缺点啥的比较了一堆。

6、预编译和直接执行的区别
我的回答:JDBC的东西,我答了参数的校验这些。别的也忘记了,太久远了,记不得了。(这个题我没回答好)
然后接着就问我有没有写过JDBC的代码,我说在学校里写过,忘记的差不多了,这个话题就过了。

7、然后问我写SQL要注意什么,我反问是不是有索引的情况?他说两种情况都说一说。
我的回答:首先我说所有表在创建的时候都会生成一个唯一的聚集索引,用的是主键。
没有其他索引的时候,我不建议写很复杂的SQL,我宁愿写简单的小SQL然后多写一些注释,用java8的stream去操作。把查询列表补全,不在sql里面进行计算啥啥啥的说了一些。
有索引的时候,最左前缀,模糊匹配,字符串写单引号等等,索引创建选择区分度很大的列做索引列,写sql的时候尽量覆盖索引吧,不然会导致回表次数的增多,也会影响查询效率。就说了这些。

8、然后问我微服务,限流熔断怎么处理,怎么保证可用。
我的回答:踩现在我做的项目里面用的,都还没有用Nocas,Seninel这些。熔断限流我先说的是Hystrix的方案,然后说阿里的那一套方案,对比着来说,有不同维度的思考。
之后问我怎么拆服务,我给他说了一下我的思路。大概就是避免分布式事务的产生。然后补充说了一下分布式事务(Seata的二阶段提交)这一部分吹的比较多。(TC-TM-RM的二阶段补偿方案,TCC的补偿方案,和进最大努力同时的方案)。微服务很重要,但是回答这一部分问题也是有办法的,不要飘在天上,要结合实际的情况去回答,就容易过。

9、问我用redis做过什么。
Redis是分布式系统万金油,能做的东西特别特别多。主要的是缓存和分布式锁,访问量,点赞次数这些场景。
然后接着提问分布式锁,我就把set key if not exit到Redisson续约的一套流程给他说了出来。

11、然后问了我io流不关闭会怎么样。
我就只回答NIO内存不关闭,这部分内存不归虚拟机管,会资源浪费并且不可控。 (这个题我没回答好)

12、接着就问我,有没有遇到内存溢出的问题
用对象去同步数据表,heap堆内存爆了。这个场景还是很常见的。

之后好像差不多就是在瞎聊了,说完了问我有没有什么想要问的。

13、问了问我linux用来干什么?
我说我自己的项目一般就是做服务器,运行Jar包,前后端分离之后也就只负责这些事情了。
然后说那你自己玩的时候用来干嘛,我一看就觉得大事不妙。我就说一般我就拿来玩玩docker,部署一下自己的容器,在测试的时候不用装在本地,像redis这些也是装虚拟机上。(说实话,全程我不知道他问这个是有什么企图)
然后问我最近在学什么,我说k8s,因为自己想往云计算方向转一下,就玩一玩。
问我为什么不做架构师,去学云计算?
我说Java开发不稀缺了。

中间还问了几个小问题,我记得不是很清楚了,回答的也不是很好。
1、Session和Cookie
2、集群数据之间怎么弄,我没搞懂意思,我就说了一下负载均衡跟nginx做请求的代理。他追着问单点登录的事情,我也回答了,这里我一直没有明白他想问什么。
3、还有一个三级缓存,他还强调三级缓存是一种思想,我一开始答Spring的时候已经跟他说过了,可能他记不得了。
4、Hibernate的有几个小问题,我记不得问的啥了,我直接说不太会,因为还没看过源码。

二面 (一小时)

问的很多,还能想起来的有,分一下类吧,难的,一般的,简单的,不会的。

稍微难一点的
缓存击穿的布隆过滤器、乐观锁的适应性自旋、并发里面的cpu缓存解决带来的伪共享问题。

常规的
SpringIOC创建过程又背了一遍,bean生命周期,作用域这些。
雪花算法、数据表的水平拆分、nginx的反向代理

简单的
HashMap和HashTable、ArrayList和LinkedList、获得线程的方式。

不太会的
session cookie token用来干嘛,生产者消费者模式。我不知道的:memacahce,线程的本地变量。
还问了一个四次挥手(我大概说了一下,记不得那几个变量的名称了)
MyBatis的源码也问了(我没看过,所以没答上来,然后这个本来不该写在简历上的,失误了)
还有几个记不得了,大概不知道的有四五个问题。

公司二 线上面

一面 笔试

比较简单,也不会靠特别深的算法题,就常规的字符串处理,稍微练习一下是肯定能过的。

二面 技术 (40分钟)

1、JVM垃圾回收,类加载系统
分代理论假说到堆的内存划分到GCRoots,收集算法,不同分代用不同收集算法。
加载、链接、初始化,连接又分为:验证,准备,解析三步骤。

2、数据源配置,数据库连接池
就说了durid连接池,连接复用。底层没看过。

3、Tomcat怎么运行的
基本不太会。

4、Redis
缓存,分布式锁,基本数据类型都问了。

5、场景题:假设现在并发很大,怎么去保证数据库安全
我的回答:首先是服务降级限流熔断,之后我假设读写请求两种情况,Redis缓存该怎么处理,最后是mysql的主从读写分离

6、算法题:数组找前K个最大的。 堆排序
弱项,不太会

7、内存泄露和内存溢出
这个还好。

8、HashMap、ConcurrentHashMap 还有HashCode
面试必问,扩容,结构,get、put流程这些。HashMap重写了Object的HashCode方法,跟其他的规则有点不一样。key的HashCode累加得到整个HashMap的HashCode值。

公司三(线上面试)

一面 (一小时)

1、分布式
SpringCloiud 的框架都点了,还有阿里最新的一套,Nacos,sentinel做服务熔断限流降级持久化到数据库,seate分布式事务(TC二阶段提交)

2、JVM (问的最多)
类加载机制,沙箱安全,运行时数据区(我答漏了一个程序计数器,他就接着提问,真被自己蠢到了),可达性分析,OopMap,OOM,StackOverFlow,垃圾收集算法,垃圾收集器(G1),记忆集。
新生代几次对象几次到老年代?(15)
有没有可能直接把刚new出来的对象放在老年代?(有可能,空间分配担保策略)

3、多线程(问的也超级多)
volatile,CAS,总线嗅探,CPU缓存一致性协议
ReentrantLock、ThreadLocal、Lock和Synchronized的区别,CountDownLatch,ABC三个线程怎么去保证顺序执行?

4、数据库优化
B+树,Hash索引,最左前缀,索引优化分析,一条龙服务。

5、Redis
一来就是分布式锁。后面又问数据类型。

6、基础 (回答的稀烂)
HashMap:我直接答错了,他说扩容的触发条件是 负载和Hash冲突 这个我真不知道
final 修饰一个变量String 怎么去改,我说改不了,他说用反射
final 修饰一个对象Person,能不能去改对象的属性 (问到这里我就知道 final是仅仅不能改引用的地址)

上面两个基础题答的稀烂,另外有几个问了是真不知道:
死锁怎么排查?
JVM调优什么做?
explain + sql 后面的列表都表示什么含义? (我是真的忘了)

二面:(40分钟)

场景题偏多。
1、自我介绍,直接叫点技术栈
2、HashMap & ConcurrentHashMap
3、数据库连接池
4、Spring和SpringBoot的区别
5、输入一个网址之后发生了什么?(完全懵逼,只把路由、负载均衡、SpringMVC的过程回答了出来)
6、数据库查询慢你怎么分析?(看情况说,垂直拆,索引)
7、问了几个索引走不上的情况。(字符串,like模糊匹配,又问了字符串查询怎么增加查询效率,前缀索引)
8、假如现在系统里面就是要模糊匹配怎么办?(ElasticSearch,回答了几个概念)
9、大数据了解吗?(看过一点点Handoop,回答了HDFS和MapReduce)
10、有什么想问我的?

总结

一般的面试流程是:
首先自我介绍,然后是对简历或者你自我介绍中点的技术栈进行提问,也会模拟一些场景题进行提问,提问完毕之后一般面试官都会反问你,有什么想问的,等逐一解答之后就完了。

所以刚开场的两个东西很重要,一个是简历,另一个就是自我介绍
简历这种就看个人了,如果项目经验多,那你可能就多准备一些场景题,这样会有优势一些。
如果是像我这种毕业不久,没什么项目经验的,就可以多写技术栈,说一些经典的场景。这样面试官就很好提问。

自我介绍
自我介绍很重要,一定要把控好。我觉得从四个方面说就行。
抓住四个点:自报家门、项目经验、技术栈、求职意愿。

我就会这么说:(假设这次是面阿里)
面试官你好,我叫XXX,20XX年普通一本毕业生,首先说一下自己的项目经历吧。
2019年,拿到一份银行实习岗位,是一个中小银行系统的核心项目组,自己主要负责交易模块的需求受理,保障核心交易平稳运行。毕业之后去到一家烟草行业公司,主要参与的是一个微服务化的复烤信息化系统建设,整个系统拆分为 原料,仓储,报表,质检巴拉巴拉编一些,等多个模块。而自己主要负责的就是需求的分析受理与实施,也配合项目经理运用微服务技术去解决传统单体化应用的业务痛点,整体取得的效果不错,帮助公司盈利多少多少,减少了多少多少的维护成本,巴拉巴拉说一些。
自己很想去互联网行业去历练自己,在校和工作的时候都一直在对应普遍的Java研发岗位要求进行学习和实践,自己对Spring社区、分布式场景、Redis,多线程,JVM都比较了解,希望能通过这次面试的机会进入到阿里的项目组,谢谢。
(因为传统项目确实不好说项目经验,如果有互联网项目经验的话绝对是加分的)

这样的自我介绍是比较清晰的,面试官就能直接进行提问了,也对你之前的工作比较了解。

问答板块
互联网公司的面试是很残酷的,算法、基础、底层、框架、源码、实战、场景等等。需要花时间去准备,而可能在工作中用不到的很多东西都要去准备,这就要看每个人的自我学习能力如何了,时间长短不一,毕竟只有量变,才会引起质的改变。
结合最近几个月自己的面试经历,我归纳了一些常问的技术板块和如何去逐个击破。
按照比例来划分排序依次是:
JVM、分布式微服务、数据库、Spring、多线程、Redis、算法、场景题、网络。

JVM

JVM 最常问的是:运行时数据区、垃圾回收机制、类加载系统。
怎么学习呢?建议看周志明最新版的《深入理解Java虚拟机》,多看几遍,基本就能回答上了。分代收集理论,各种垃圾收集器,内存划分策略,即时编译,等等,可以说看了必定受益匪浅。很多互联网公司问的也基本就是这本书上的内容。

分布式微服务

SpringCloud那肯定是必须会,包括最新的阿里的一套Nacos做注册中心,Sentinel做服务的限流熔断降级,Seate用二阶段提交去解决事务问题。
其实分布式说的是一整个社区,不只是SpringCloud,很多解决方案是需要去多多了解的(分布式ID生成器雪花算法,分布式缓存怎么做,分布式的运维等等),其实系统微服务化之后是比较痛苦的一个过程,经常会因为数据的耦合比较高而导致系统的整体拆分不完整,但这是一个必然的趋势,因为计算机的发展就是这样的,不可能有一台服务器能撑住大型的系统。
至于怎么学习,从搭建集群开始学起吧。

数据库

那常问的肯定就是MySQL了,主从复制、读写分离、分库分表、数据表的拆分、然后就是索引建立-使用-优化。B+树、hash索引,聚集索引,复合索引,前缀索引,回表,三星索引这些是经常问的,还有就是sql走索引的情况。字符串去查询怎么保证效率。这些都会出现在场景题里面。看一下这篇文章吧。https://blog.csdn.net/XiaoA82/article/details/107207876

Spring

Spring是面试中一个很常规的提问,IOC,AOP是什么、Bean的生命周期,作用域,然后SpringMVC的执行流程,这些都是很经典的面试题目。但是都只是皮毛,像IOC的初始化过程,循环依赖问题这些才是比较核心的知识点。

我觉得全网看下来,写Spring IOC源码解析最好的一片文章。https://javadoop.com/post/spring-ioc
AOP则也是这个作者的一篇文章。另外多说一句,大佬写的其他文章还是很精彩的。https://javadoop.com/post/spring-aop-source

多线程

按照提问频率来说 volatile配合CAS算法是最常问的,有些深一点的会提问到可见性是如何保证的?有序性是如何保证的?那就需要很深入的去学习一下,总线嗅探,内存屏障,CPU缓存一致性,为什么是锁缓存而不是锁总线这些问题了。
然后像synchronized的锁升级过程,从无锁到偏向锁,到轻量的自旋,到重锁,是依靠什么实现的。
还有AQS同步器也是会经常问的,以及聚合了他的各路锁对象。

怎么学呢?多线程这章,要学好是真的不容易,马士兵老师的课程真的很nice,还有就是一本《Java并发编程的艺术》,先从第三章之后开始看比较好。
我自己最近也在看这本书,确实很充电。

Redis

Redis以每秒万级别的访问足够在面试里面占据很重要的席位。面试还是以使用场景提问居多。五大数据类型。
用Redis做分布式锁问的最多,当然最主要的肯定是缓存,缓存击穿、穿透、雪崩是什么,而面对这些场景又该如何解决。
还有一个双写一致性,需要用延迟双删的办法去处理。
底层的数据结构倒是问的不多,但是想跳跃表这些还是需要去了解和学习的。

场景题

场具题可以说是阿里的特色吧,许多公司也开始喜欢用这样的场景题在二面、三面的过程中去考察知识的广度,遇到问题的解决办法。
多收集整理吧。

网络

TCP 三次握手,四次挥手,session,cookie,token,单点登录,tcp粘包和拆包,socket通讯,输入域名之后发生了什么…
还是看岗位和公司业务,Java研发在那些很规范的大厂会问到这些东西。
学习方法,如果不会网络只能遇到一个解决一个了。

算法

LeetCode 刷!

猜你喜欢

转载自blog.csdn.net/XiaoA82/article/details/107482187