j**a面试者该准备哪些加分项技能
建业嗨起来
2024-11-29 19:42:22
最佳回答
13.2 别单纯看单机版的框架,适当了解些分布式在描述项目里框架技术时,最好你再带些分布式的技术。下面我列些大家可以准备的分布式技术。反向代理方面,nginx的基本配置,比如如何通过lua语言设置规则,如何设置session粘滞。如果可以,再看些nginx的底层,比如协议,集群设置,失效转移等;远程调用dubbo方面,可以看下dubbo和zookeeper整合的知识点,再深一步,了解下dubbo底层的传输协议和序列化方式;消息队列方面,可以看下kafka或任意一种组件的使用方式,简单点可以看下配置,工作组的设置,再深入点,可以看下kafka集群,持久化的方式,以及发送消息是用长连接还是短拦截。以上仅仅是用3个组件举例,大家还可以看下red**缓存,日志框架,mycat分库分表等。准备的方式有两大类,第一是要会说怎么用,这比较简单,能通过配置文件搭建成一个功能模块即可,第二是可以适当读些底层代码,以此了解下协议,集群和失效转移之类的高级知识点。23.3 数据库方面,别就知道增删改查,得了解性能优化在实际项目里,大多数程序员用到的可能仅仅是增删改查,当我们用mybat**时,这个情况更普遍。不过如果你面试时也这样表现,估计你的能力就和其它竞争者差不多了。这方面,你可以准备如下的技能:sql高级方面,比如group by, h**ing,左连接,子查询(带in),行转列等高级用法;建表方面,你可以考虑下,你项目是用三范式还是反范式,理由是什么?尤其是优化,你可以准备下如何通过执行计划查看sql语句改进点的方式,或者其它能改善sql性能的方式(比如建索引等);如果你感觉有能力,还可以准备些mysql集群,mycat分库分表的技能。比如通过lvs+keepalived实现mysql负载均衡,mycat的配置方式。同样,如果可以,也看些相关的底层代码。哪怕你在前三点表现一般,那么至少也能超越将近一般的候选人,尤其当你在sql优化方面表现非常好,那么你在面试高级开发时,数据库层面一定是达标的,如果你连第四点也回答非常好,那么恭喜你,你在数据库方面的能力甚至达到了初级架构的级别。33.4 j**a核心方面,围绕数据结构和性能优化准备面试题j**a核心这块,网上的面试题很多,不过在此之外,大家还应当着重关注集合(即数据结构)和多线程并发这两块,在此基础上,大家可以准备些设计模式和虚拟机的说辞。下面列些我一般会问的部分问题:string a = "123"; string b = "123"; a==b的结果是什么?这包含了内存,string存储方式等诸多知识点;hashmap里的hashcode方法和equal方法什么时候需要重写?如果不重写会有什么后果?对此大家可以进一步了解hashmap(甚至concurrenthashmap)的底层实现;arrayl**t和linkedl**t底层实现有什么差别?它们各自适用于哪些场合?对此大家也可以了解下相关底层代码;volatile**有什么作用?由此展开,大家可以了解下线程内存和堆内存的差别;completablefuture,这个是jdk1.8里的新特性,通过它怎么实现多线程并发控制?jvm里,new出来的对象是在哪个区?再深入一下,问下如何查看和优化jvm虚拟机内存;j**a的静态代理和**有什么差别?最好结合底层代码来说。通过上述的问题点,我其实不仅仅停留在“会用”级别,比如我不会问如何在arrayl**t里放元素。大家可以看到,上述问题包含了“多线程并发”,“jvm优化”,“数据结构对象底层代码”等细节,大家也可以举一反三,通过看一些高级知识,多准备些其它类似面试题。43.5 linux方面,至少了解如何看日志排查问题如果候选人能证明自己有“排查问题”和“解决问题”的能力,这绝对是个加分项,但怎么证明?目前大多数的互联网项目,都是部署在linux上,也就是说,日志都是在linux,下面归纳些实际的linux操作。能通过less命令打开文件,通过shift+g到达文件底部,再通过?+**的方式来根据关键来搜索信息;能通过grep的方式查**,具体用法是, grep ** 文件名,如果要两次在结果里查找的话,就用grep **1 文件名 | **2 --color。最后--color是高亮**;能通过vi来编辑文件;能通过chmod来设置文件的权限。当然,还有更多更实用的linux命令,但在实际面试过程中,不少候选人连一条linux命令也不知道。还是这句话,你哪怕知道些很基本的,也比一般人强了。53.6 通读一段底层代码,作为加分项如何证明自己对一个知识点非常了解?莫过于能通过底层代码来说明。我在和不少工作经验在5年之内的程序员沟通时,不少人认为这很难?确实,如果要通过阅读底层代码了解分布式组件,那难度不小,但如果如下部分的底层代码,并不难懂。arrayl**t,linkedl**t的底层代码里,包含着基于数组和链表的实现方式,如果大家能以此讲清楚扩容,“通过枚举器遍历“等方式,绝对能证明自己;hashmap直接对应着hash表这个数据结构,在hashmap的底层代码里,包含着hashcode的put,get等的操作,甚至在concurrenthashmap里,还包含着lock的逻辑。我相信,如果大家在面试中,看看而言concurrenthashmap,再结合在纸上边说边画,那一定能征服面试官;可以看下静态代理和**的实现方式,再深入一下,可以看下spring aop里的实现代码;或许spirng ioc和mvc的底层实现代码比较难看懂,但大家可以说些关键的类,根据关键流程说下它们的实现方式。5此文章未经授权抓取自百度经验6其实准备的底层代码未必要多,而且也不限于在哪个方面,比如集合里基于红黑树的treeset,基于nio的开源框架,甚至分布式组件的dubbo,都可以准备。而且准备时未必要背出所有的底层(事实上很难做到),你只要能结合一些重要的类和方法,讲清楚思路即可(比如讲清楚hashmap如何通过hashcode快速定位)。那么在面试时,如何找到个好机会说出你准备好的上述底层代码?在面试时,总会被问到集合,spring mvc框架等相关知识点,你在回答时,顺便说一句,“我还了解这块的底层实现”,那么面试官一定会追问,那么你就可以说出来了。end 20210311