不容错过的Java高级面试题

论坛 期权论坛     
选择匿名的用户   2021-5-23 05:23   77   0
<blockquote>
<p style="margin-left:0pt;">又到跨年之际,想必在这一年技术成长颇多的猿友们为备战金三银四而蠢蠢欲动了吧。工欲善其事必先利其器。停止无病呻吟和眼高手低,脚踏实地地狂刷面试题,offer拿到手软不再是空谈。帝都的雁为大家汇总本人在今次找工作中遇到的面试题,希望可以帮到猿友。</p>
<p style="margin-left:0pt;">(PS:博主本次找工作参加面试的知名企业有:有快手/字节/阿里/滴滴/boss直聘/携程/猎聘/好未来/京东/美团/当当,最终也如愿进入其中一家大厂;面试题基于Java全栈,参照个人简历的技术栈由浅至深询问。故建议猿友们在简历上写自己hold得住的技能,切莫画蛇添足。以本人技术栈为例,答案均为本人的理解,仅供参考。)</p>
</blockquote>
<h2 style="margin-left:0pt;"><img alt="" src="https://beijingoptbbs.oss-cn-beijing.aliyuncs.com/cs/5606289-706626db3a57409457270c4262747f27.gif"></h2>
<h2 style="margin-left:0pt;"><span style="color:#ffbb66;">一、设计模式</span></h2>
<blockquote>
<p style="margin-left:0pt;">列举常被问到的设计模式。</p>
</blockquote>
<h3 style="margin-left:0pt;"><span style="color:#86ca5e;"><strong><strong>策略(阿里/快手/京东/猎聘)</strong></strong></span></h3>
<blockquote>
<p style="margin-left:0pt;">问:在项目哪些地方使用到了策略设计模式。</p>
<p style="margin-left:0pt;">答:重构订单状态变更逻辑。系统中订单的状态有好多个,每一个状态对应一种业务逻辑,以前的代码按照if() else if()分支去处理,代码臃肿且冗余。我定义订单策略的抽象类抽取共同行为和属性,再将每个订单状态的业务逻辑封装为订单策略实现类,并放入spring的IOC中;定义一个枚举,将订单的状态和订单策略实现类的beanID进行映射。最后定义策略上下文对象,用于交互即可。</p>
</blockquote>
<p> </p>
<h3 style="margin-left:0pt;"><span style="color:#86ca5e;"><strong><strong>单例(快手/boss直聘/滴滴)</strong></strong></span></h3>
<blockquote>
<p style="margin-left:0pt;">问:手写一个单例。</p>
<p style="margin-left:0pt;">答:我一般为了简单,会直接写饿汉式。但会向面试官阐述单例的一些实现方式和注意事项。</p>
<p style="margin-left:0pt;">单例是指一个类在一个JVM中仅有一个实例对象。常见的实现方式有饿汉式、懒汉式、线程安全的懒汉式、双重检验锁&#43;volatile、静态内部类、枚举等方式。反射和反序列化可以破坏单例,所以需要在单例的构造中再次判断实例对象是否已创建,进而抛出异常进行规避。</p>
</blockquote>
<p> </p>
<h3 style="margin-left:0pt;"><span style="color:#86ca5e;"><strong><strong>代理(猎聘/字节/阿里)</strong></strong></span></h3>
<blockquote>
<p style="margin-left:0pt;">问:动态代理的实现方式。</p>
<p style="margin-left:0pt;">答:继承目标类或实现目标类接口。</p>
<p style="margin-left:0pt;">JDK动态代理基于实现目标类接口,写一个方法增强器实现invocationHandler接口,重写其invoke方法,然后通过Proxy.newInstance的方式传入目标类的类加载器、目标类实现的接口,以及自定义的方法增强器,然后创建代理对象。本质上是动态拼接了一个实现了目标类接口的代理类的字符串,将这个字符串输出至本地的一个Java文件中,再通过Java编译器编译,变为class文件,类加载器将其加载至JVM内存,以反射的方式进行实例化使用。</p>
<p style="margin-left:0pt;">CGLIB动态代理基于继承目标类。写一个MethodIntercepter的实现类,重写其invokeSuper方法,然后通过Enhancer的方式进行创建使用。底层通过ASM字节码技术生成了三个文件:代理类字节码、目标类索引文件、代理类索引文件。索引文件中将当前类中方法名称和参数列表类型组成签名,按照hash生成一个下标,然后通过switch case的方式列举,故而访问起来会比反射的方式更快。</p>
</blockquote>
<p> </p>
<h3 style="margin-left:0pt;"><span style="color:#86ca5e;"><strong><strong>观察者(boss直聘/携程/滴滴/美团/当当)</strong></strong></span></h3>
<blockquote>
<p style="margin-left:0pt;">问:观察者的使用场景。</p>
<p style="margin-left:0pt;">答:订单发货后需要给商家发短信和邮件。由于我们系统前期没有引入MQ,所以采用异步线程去进行解耦。发货可以看作一个事件,短信和邮件可以看作两个观察者。采用spring的Event事件通知去实现此功能。</p>
</blockquote>
<p> </p>
<h3 style="margin-left:0pt;"><span style="color:#86ca5e;"><strong><strong>模板方法(阿里/快手/京东)</strong></strong></span></h3>
<blockq
分享到 :
0 人收藏
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

积分:3875789
帖子:775174
精华:0
期权论坛 期权论坛
发布
内容

下载期权论坛手机APP