2024年最新Java 面试秘诀_java 不同年限面试题(1)

反向代理方面,nginx的基本配置,比如如何通过lua语言设置规则,如何设置session粘滞。如果可以,再看些nginx的底层,比如协议,集群设置,失效转移等;

远程调用dubbo方面,可以看下dubbo和zookeeper整合的知识点,再深一步,了解下dubbo底层的传输协议和序列化方式;

消息队列方面,可以看下kafka或任意一种组件的使用方式,简单点可以看下配置,工作组的设置,再深入点,可以看下Kafka集群,持久化的方式,以及发送消息是用长连接还是短拦截。

以上仅仅是用3个组件举例,大家还可以看下Redis缓存,日志框架,MyCAT分库分表等。准备的方式有两大类,第一是要会说怎么用,这比较简单,能通过配置文件搭建成一个功能模块即可,第二是可以适当读些底层代码,以此了解下协议,集群和失效转移之类的高级知识点。
3.3 数据库方面,别就知道增删改查,得了解性能优化
在实际项目里,大多数程序员用到的可能仅仅是增删改查,当我们用Mybatis时,这个情况更普遍。不过如果你面试时也这样表现,估计你的能力就和其它竞争者差不多了。
这方面,你可以准备如下的技能:
SQL高级方面,比如group by, having,左连接,子查询(带in),行转列等高级用法;

建表方面,你可以考虑下,你项目是用三范式还是反范式,理由是什么?

尤其是优化,你可以准备下如何通过执行计划查看SQL语句改进点的方式,或者其它能改善SQL性能的方式(比如建索引等);

如果你感觉有能力,还可以准备些MySQL集群,MyCAT分库分表的技能。比如通过LVS+Keepalived实现MySQL负载均衡,MyCAT的配置方式。同样,如果可以,也看些相关的底层代码。

哪怕你在前三点表现一般,那么至少也能超越将近一般的候选人,尤其当你在SQL优化方面表现非常好,那么你在面试高级开发时,数据库层面一定是达标的,如果你连第四点也回答非常好,那么恭喜你,你在数据库方面的能力甚至达到了初级架构的级别。
3.4 Java核心方面,围绕数据结构和性能优化准备面试题
Java核心这块,网上的面试题很多,不过在此之外,大家还应当着重关注集合(即数据结构)和多线程并发这两块,在此基础上,大家可以准备些设计模式和虚拟机的说辞。
下面列些我一般会问的部分问题:
String a = “123”; String b = “123”; a==b的结果是什么?这包含了内存,String存储方式等诸多知识点;

HashMap里的hashcode方法和equal方法什么时候需要重写?如果不重写会有什么后果?对此大家可以进一步了解HashMap(甚至ConcurrentHashMap)的底层实现;

ArrayList和LinkedList底层实现有什么差别?它们各自适用于哪些场合?对此大家也可以了解下相关底层代码;

volatile关键字有什么作用?由此展开,大家可以了解下线程内存和堆内存的差别;

CompletableFuture,这个是JDK1.8里的新特性,通过它怎么实现多线程并发控制?

JVM里,new出来的对象是在哪个区?再深入一下,问下如何查看和优化JVM虚拟机内存;

Java的静态代理和动态代理有什么差别?最好结合底层代码来说。

通过上述的问题点,我其实不仅仅停留在“会用”级别,比如我不会问如何在ArrayList里放元素。大家可以看到,上述问题包含了“多线程并发”,“JVM优化”,“数据结构对象底层代码”等细节,大家也可以举一反三,通过看一些高级知识,多准备些其它类似面试题。
3.5 Linux方面,至少了解如何看日志排查问题
如果候选人能证明自己有“排查问题”和“解决问题”的能力,这绝对是个加分项,但怎么证明?目前大多数的互联网项目,都是部署在Linux上,也就是说,日志都是在Linux,下面归纳些实际的Linux操作。
能通过less命令打开文件,通过Shift+G到达文件底部,再通过?+关键字的方式来根据关键来搜索信息;

能通过grep的方式查关键字,具体用法是, grep 关键字 文件名,如果要两次在结果里查找的话,就用grep 关键字1 文件名 | 关键字2 --color。最后–color是高亮关键字;

能通过vi来编辑文件;

能通过chmod来设置文件的权限。

当然,还有更多更实用的Linux命令,但在实际面试过程中,不少候选人连一条linux命令也不知道。还是这句话,你哪怕知道些很基本的,也比一般人强了。
3.6 通读一段底层代码,作为加分项
如何证明自己对一个知识点非常了解?莫过于能通过底层代码来说明。我在和不少工作经验在5年之内的程序员沟通时,不少人认为这很难?确实,如果要通过阅读底层代码了解分布式组件,那难度不小,但如果如下部分的底层代码,并不难懂。
ArrayList,LinkedList的底层代码里,包含着基于数组和链表的实现方式,如果大家能以此讲清楚扩容,“通过枚举器遍历“等方式,绝对能证明自己;

HashMap直接对应着Hash表这个数据结构,在HashMap的底层代码里,包含着hashcode的put,get等的操作,甚至在ConcurrentHashMap里,还包含着Lock的逻辑。我相信,如果大家在面试中,看看而言ConcurrentHashMap,再结合在纸上边说边画,那一定能征服面试官;

可以看下静态代理和动态代理的实现方式,再深入一下,可以看下Spring AOP里的实现代码;

或许Spirng IOC和MVC的底层实现代码比较难看懂,但大家可以说些关键的类,根据关键流程说下它们的实现方式。

其实准备的底层代码未必要多,而且也不限于在哪个方面,比如集合里基于红黑树的TreeSet,基于NIO的开源框架,甚至分布式组件的Dubbo,都可以准备。而且准备时未必要背出所有的底层(事实上很难做到),你只要能结合一些重要的类和方法,讲清楚思路即可(比如讲清楚HashMap如何通过hashCode快速定位)。
那么在面试时,如何找到个好机会说出你准备好的上述底层代码?在面试时,总会被问到集合,Spring MVC框架等相关知识点,你在回答时,顺便说一句,“我还了解这块的底层实现”,那么面试官一定会追问,那么你就可以说出来了。

预估面试题,准备对应的回答

4.1 哪些问题面试中大概率会被问到
在面试里,不管如何引导面试官,其实如下方面的问题很大可能会被问到,所以在面试前可以提前准备。
职位介绍里提到的技能要点,比如职位介绍里有提到Mybatis,那么面试官一定会问相关问题;

你在项目介绍时抛出的技术关键字,比如你在面试过程中介绍项目时提到了Redis,那么在介绍完项目后,面试官就会问,“你项目里是如何使用Redis的?”,类似的,简历中你写的技术,也有可能会被问到;

Java核心,数据库,Spring框架,项目管理等基础问题,这些就不用说了,不过如果你引导得当的话,面试官会花费很多时间问你提到的技术,这块会问得比较少;

必要的算法题,比如排序等,其实面试官感觉你技术可以的话,这块就不怎么会问了,但准备的时候需要看这个,有备无患。

4.2 面试官提问的方式
以上介绍了常见问题的种类,这里介绍下面试官常用的提问方式。
问用法,比如直接提问,项目里你netty怎么用的?这块大家可以结合项目准备说辞;

问流程,比如结合业务,讲下nginx负载均衡的用法?这也可以结合项目和网上搜到的资料准备说辞;

问原因,比如为什么要用netty?这块就要结合项目说明了;

问技术点, 比如netty里零拷贝怎么回事?对此,需要对简历上提到的每个技术点,以及面试过程中将要提到的每个技术点,搜相关面试问题,并结合业务说明;

问基础知识,比如finally从句的用途,这就可以通过刷题来获取了。

4.3 举例说明该如何准备面试问题
下面给出准备问题的技巧。
斟酌面试时抛出的技能,逐一准备说辞;

针对技术,网上搜索问题,比如搜Spring IOC面试题,结合网上的参考答案准备说辞;

准备技术的实施要点,比如做了哪些配置文件,你在项目里踩过哪些坑?

最好结合底层代码说明。

如下给出两个例子,先以MyCat分库分表为例,给出介绍说辞的技巧。
准备业务背景,为什么要用?比如我们项目数据库并发压力大,需要用MyCat作为分库分表;

如何使用,无非是设置分库规则,改写SQL语句等;

准备下踩到的坑,比如自增长主键在每台机器上都要保证唯一;

然后再结合些底层代码,准备下一条SQL语句是如何分发到对应的分库上的,然后执行好以后又如何返回的;

再可以准备些只有做过才知道的细节,比如发布上线和清洗数据的流程;

网上找些MyCAT的面试题,准备相关说辞。

一般说到了这里,面试官就不怎么问了,哪怕你后面再被问倒,面试官也会感觉你MyCat很熟悉。
下面以Netty为例,给出相关技巧。
结合业务需求点,说下为什么要用这个技术,怎么用的,以及用了有什么好处? 比如为了优化网络通讯协议,所以用基于TCP协议的Netty,业务模块里的xxx功能是用到netty;
准备下踩到的坑,比如在某业务场景里,我遇到了半包粘包问题,我是通过调试底层代码解决的;
用了Netty对项目的帮助。比如Netty是基于TCP协议的,它要比Http协议要轻,所以通讯性能高,且Netty内部的Reactor线程模型对系统的IO帮助很大;
基于零拷贝、读写索引和异步处理机制,准备些底层代码,在面试里说明;
顺带再准备下Netty的组件,工作流程等问题,这能搜到问题和相关说辞。

在讲的时候,大家甚至可以边画Netty流程图,再结合底层代码说明,这样面试官一定会对大家刮目相看。
其实这里仅仅是抛砖引玉,或者提到的技术比较高深 ,但可以讲述的技术还可以是线程池,MyBatis组件,Redis,甚至是虚拟机优化等。哪怕是初级开发,也能多少抓住一两个点,按上述思路说明。

面试时如何不被面试官牵着鼻子,自我把控面试的走向?

5.1 在介绍项目时,引导话题的技巧以及案例
在做项目介绍的时候,你可以穿插说出一些你的亮点,但请记得,不论在介绍项目还是在回答问题,你当前的职责不是说明亮点而是介绍项目,一旦你详细说,可能会让面试官感觉你跑题了。
所以这时你可以一笔带过,比如你可以说,“我们的项目对数据要求比较大,忙的时候平均每小时要处理几十万条数据”,这样就可以把面试官引入“大数据”的方向。
你在面试前可以根据职位的需求,准备好这种“一笔带过”的话。比如这个职位的需求点是Spring MVC框架,大数据高并发,要有数据库调优经验,那么介绍以往项目时,你就最好突出这些方面你的实际技能。
再给大家举个例子,比如Java虚拟机内存管理和数据库优化是绝大多数项目都要遇到的两大问题,大家都可以在叙述项目经验时说,在这个项目里,我们需要考虑内存因素,因为我们的代码只允许在2G内存环境中运行,而且对数据库性能要求比较高,所以我们经常要监控优化内存和数据库里的SQL语句。这样当面试官深入提问时,就能抛出自己准备好的虚拟机内存优化和数据库优化方面的说辞。
或者说,在项目介绍时提到,在xx模块里,我们使用了nginx做负载均衡,达到了承受百万级并发的效果,从而引出nginx的话题。
实在不行,你也可以说“我除了做开发,也做了了解需求,测试和部署的工作,因为这个项目人手比较少,压力比较大”,这样你也能展示你有过独挡一面的经历。
5.2 以Netty为例,讲述引出值钱话题的技巧
比如在介绍项目时,我提到了Netty技术,如果面试官没打断,我就问,能否介绍其中的Netty细节?得到允许后再说。
或者把技术关联到面试官可能会问的问题上,比如问及网络通讯时介绍Netty,这个事先整理一个问题列表,遇到此类问题,顺带抛出Netty说辞。
问题列表可以是,项目里你用到哪些组件?用到哪些通讯协议?如何进行模块间的交互等等,然后先回答问题本身,再扩展到Netty。但请记住,别自说自话,因为过犹不及,其它技术照此办理
5.3 以案例说明,在回答问题时引出准备过话题的技巧
比如面试官问你Spring相关问题,假设问到,你对Spring依赖注入了解多少,在说好Spring相关问题后再提一句,我们同时用Spring,以低耦合的方式整合了MyCAT组件,从而达到了分库分表的效果,这样就引出了分库分表的话题 。
或者在介绍Netty流程后,再说一句,在实际项目里,我们还遇到了因Netty底层代码而导致的OOM问题,对此,我们组负责排查和解决问题,这样就自然而然地引出了OOM内存溢出的问题。
或者在介绍完线程相关问题时,再提一句,在项目里,我们用到了线程池来管理线程,这样就引出了高并发的话题。
但在引导的时候,请注意如下的三点。
第一,面试官不接口的,应当立即停止,再说下去就属于自说自话了。
第二,还是要准备必要的基础问题,还是要刷题,还是要准备各种说辞,因为面试前的全面准备,是引导的基础。
第三,应当引导面试官问些“框架”和“性能调优”等值钱方面的技能,这样才能最大程度地展示你的能力,同样,此类问题需要面试前准备。
5.4 你可以引导的加分项
在如下的一些表格里,归纳的加分项甚至初级开发多少也能准备,其中涵盖了诸多方面。
表 Java Core方面可以准备的亮点
技术方面
可以说的亮点
Java集合对象
1 能根据项目的需求选用合适的集合对象,比如知道ArrayList和LinkedList的差异,并能合理选用。
2 能在合适的场合选用WeakHashMap。
3 可以适当讲一些集合的JDK底层实现代码。
异常处理方面
能在finally从句里写释放资源的代码
JDBC方面
1 能通过PreparedStatement的预处理方法来防止SQL注入。
2 能通过批处理来提升操作性能。
3 能通过实例讲述事务隔离级别的含义
多线程方面
1 会结合项目使用线程池
2 能通过锁或信号量等手段正确地处理多线程并发时的数据一致性。
3 熟悉各种并发组件
表 数据库方面可以准备的亮点

技术方面
可以说的亮点
建表
建表时需要根据项目的数据情况,考虑是采用三范式或是反范式。
SQL调优
1 可以通过查看日志等方式看哪些SQL需要调优。
2 可以通过执行计划查看SQL的所消耗的代价,并据此调优。
3 可以通过建索引,建分区等手段来优化SQL性能。
事务
1 可以说下JDBC或Spring里是如何管理事务的。
2 可以说下Spring里的声明式事务的做法和优点。
3 可以举例说明事务隔离级别和事务传播机制的用法。
分布式数据库
1 可以通过MyCAT进行分库分表,从而减轻对单表访问所需要的代价。
2 可以通过集群等方式来承担对数据库的过量的访问请求。
NoSQL和Hadoop
这两个本身就是个亮点,如果大家用过,可以结合项目来说明。
表Java Web框架方面可以准备的亮点

技术方面
可以说的亮点
Spring MVC/Boot架构
1 可以说下Spring的IOC和AOP是如何优化项目结构的。
2 可以说下拦截器等Spring组件对项目的帮助。
3 可以说下Spring Boot对项目的帮助
ORM,比如Mybatis
使用这种ORM技术时,如何优化访问和操作数据库的性能。
Spring和Mybatis等的整合
可以讲下整合框架的细节,并可以举例说明整合后的框架能很好地适应需求的变更。
表 分布式组件方面可以准备的亮点

技术方面
可以说的亮点
组件应用
1 结合配置文件等,说明怎么用的
2 结合业务,说下具体的效果,比如限流后有什么好处。
如何应对高并发的场景
1 如何达到负载均衡
2 如何进行失效转移
定位排查和解决问题
1 如何通过分析log定位问题
2 问题的根源和解决方法
健康检查和线上监控
1 如何通过健康检查确定系统正常运行
2 出了问题,如何发出警告
由此大家能看到,其实很多事先可以准备的点,其实是你没有想到,但你项目里一定用过。你据此准备,在通过上述技巧在面试中合理地找机会说出来,你面试成功的可能性一定会大大增加。

总结,面试准备后,结果可能就大不同

img
img

网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。

需要这份系统化资料的朋友,可以戳这里获取

一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!

.(img-rQOJTEX6-1714682367999)]

网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。

需要这份系统化资料的朋友,可以戳这里获取

一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值