当前位置: 首页 > 科技观察

一个3年工作经验的Java程序员应该具备的技能

时间:2023-03-12 17:18:16 科技观察

一个3年工作经验的Java程序员应该具备的技能。这可能是Java程序员比较关心的。在这里要说明一下,下面列出的内容不是每个人都会知道的——但是如果你掌握的越多,最终能拿到的评价和薪水必然会更高。1.基本语法这包括static、final、transient等关键字的作用,foreach循环的原理等。在今天的采访中,我问了大家static关键字的作用是什么。如果你回答静态修改变量和修改方法,我就认为你合格。如果你回答静态块,我会认为你很好。如果你回答静态内部类,我会觉得你很好。,如果你回答静态导入包,我会很满意你,因为可以看出你非常热衷于研究技术。最深入的一次,记得面试官直接问我Volatile关键字的底层实现原理(顺便说一句,面试和面试本身是相对的,面试官可以问这个问题也让面试官感觉面试官也是一个喜欢研究技术的人增加面试官对公司的好感度,最后还是选择了问这个问题的公司),不要觉得这个太挑剔了——问题越简单越能看一个人的水平,别人对你技术的考量大部分是先深度,后广度,切记。2.收藏很重要,一定要问。基本上,它是List、Map和Set。问的是各种实现类的底层实现原理,以及实现类的优缺点。Collection需要掌握ArrayList、LinkedList、Hashtable、HashMap、ConcurrentHashMap、HashSet的实现原理,能够流利的答题。当然,如果能掌握CopyOnWrite容器和Queue就更好了。另外,ConcurrentHashMap的问题在面试中被问的比较多,可能是因为这个类可以出很多题。关于ConcurrentHashMap,我给网友们提供三个答案或者研究方向:(1)ConcurrentHashMap锁切分技术。(2)ConcurrentHashMap的读取是否需要加锁,为什么。(3)ConcurrentHashMap的迭代器是强一致迭代器还是弱一致迭代器。3.框架是老生常谈,面试必须要问的东西。一般来说,我会问你项目中使用的框架,然后给你一些场景,问你如何使用框架。比如在Spring初始化bean的时候想做什么,bean销毁的时候怎么办?有些东西是怎么做的,MyBatis中$和#的区别等等,这些比较实用。好好积累,多了解框架的细节,自然不是问题。如果以上问题回答得好,面试官往往会深入询问框架的实现原理。问得最多的就是SpringAOP的实现原理了。当然,这个很简单,两句话就可以搞定,即使你不知道如何准备。我遇到的最变态的事情就是让我画一张Spring的Bean工厂实现的UML图。这么深的问题我当然回答不了/(ㄒoㄒ)/~~4.数据库数据库十有八九也会问。一些基础图片和all、leftjoin、几个索引的区别就不说了。更重要的是数据库性能的优化。如果你对数据库性能优化一无所知,那么如果你有时间的话,我建议你花一两天的时间准备一下SQL基础和SQL优化的内容。但是,无需担心数据库。一个公司往往有很多部门。如果你对数据库不熟悉,基础技术好,90%的人都会问你。估计你会被安排在一个对数据库使用要求不是很高的部门。锻炼一下。5、Web方面的一些问题Java主要是面向Web端的,所以Web方面的一些问题也是要问的。我遇到最多的两个问题是:说说分布式Session的几种实现。四个常用的答案,自然能让面试官非常满意。还有一个常见问题是:说说Session和Cookie的区别和联系,以及Session的实现原理。除了这两个问题,web.xml中的内容才是重点,Filter、Servlet、Listener,不说它们的实现原理,至少知道它们的使用基础。另外,get/post、forward/redirection的区别、HTTPS的实现原理等一些细节也可能会被考察。6.数据结构与算法分析数据结构与算法分析对于一个程序员来说总比没有好,在工作中肯定能派上用场。数组和链表是基础。栈和队列稍微深一点,但不难。树木非常重要。比较重要的树是AVL树和红黑树。你不需要了解它们的具体实现,但你必须知道什么是二叉搜索树,平衡树、AVL树和红黑树有什么区别。我记得有一次面试,我和一个面试官谈到了数据库的索引。他问我:你知道索引用的是哪种数据结构吗?我回答了Hashtableused,答案是错误的。他又问,你知道为什么要用树吗?我回答是因为Hash表的冲突可能比较多,面对千万甚至上亿的数据,会大大增加查找的时间复杂度。树比较稳定,基本保证最多20、30次能找到想要的数据。对方说的也不完全对。最后,我们交换了这个问题。我也理解为什么我们使用树。我不会在这里谈论它。网友朋友们为什么觉得索引要用树来实现呢?至于算法分析,不知道或者不想研究也没关系。记得有一次面试,对方问我Collections.sort方法用的是哪种排序方式。呃,吐血。当然为了显示自己的博学,我对算法分析也有一定的研究(⊙﹏⊙)b,我还是硬着头皮说可能是冒泡排序。当然,答案肯定不是。有兴趣的网友可以看看Collections.sort方法的源码,里面使用了一种叫做TimSort的排序方法,这是一种增强的归并排序方法。7.Java虚拟机出乎我的意料。Java虚拟机应该是非常重要的一块内容。结果在这些公司被问到的概率几乎为0。要知道,我去年花了很多时间研究Java虚拟机。周志明老师的《深入理解Java虚拟机:JVM高级特性与最佳实践》我看了不下五遍。言归正传,Java虚拟机虽然没问过,但我觉得还是很有必要研究一下的。我就简单的做一个提纲,说说Java虚拟机中比较重要的内容:(1)Java虚拟机的内存布局(2)GC算法和几种垃圾收集器(3)类加载机制,即双亲委派模型(四)Java内存模型(五)happens-before规则(六)volatile关键字使用规则也许面试没用,但在以后牛的路上,肯定不行。8、设计模式本来以为是很重要的一个内容,结果在阿里巴巴B2B事业部面试的时候只问了一次。当时的问题是关于装饰者模式的。当然,我们不能这么功利。学习面试,设计模式在工作中还是非常重要和有用的。在23种设计模式中,关注常用的十几种就足够了。面试中关于设计模式的问答主要是三种。三个方向:(1)你的项目中使用了哪些设计模式,如何使用。(2)了解常用设计模式的优缺点。(3)能够绘制常用设计模式的UML图。9.多线程这也是必问的。因为三年的工作经验,基本不会问你多线程是怎么实现的。Thread和Runnable的区别和联系,线程多次启动会发生什么,线程有哪些状态等更深入的问题我会问。当然,这只是最基本的。没想到几个面试几乎同时问了一个问题,而且问的方式不一样。总结一下就是这样的意思:如果有Thread1、Thread2、ThreadD3、Thread4四个线程,分别统计C、D、E、F盘的大小,所有线程都统计完交给Thread5总结一下,应该如何实施?聪明的网友对这个问题有答案吗?不难,java.util.concurrent下有现成的类。另外,线程池也是一个经常被问到的问题。常用的线程池有多少种?这几种线程池有什么区别和联系?线程池的实现原理是什么?如果比较实用,我会给你一些具体的细节。对于场景,让你回答这个场景用什么样的线程池比较合适。最后,虽然这次面试题目不多,但是多线程同步和锁也是重点。synchronized和ReentrantLock的区别,synchronized锁的普通方法和锁的静态方法,死锁的原理和排查方法等。10.JDK源码想高薪必读JDK源代码。以上内容也可能与具体场景有关。JDK源码就是看你平时喜不喜欢研究。在我的面试中,我被问了很多关于JDK源代码的问题,其中一个最棘手的问题是问我String的hashCode()方法是如何实现的。好在我平时看了很多String源码,所以给出了一个大概的答案。JDK的源码其实没什么可以总结的。纯靠个人,总结比较重要的源码:(1)List、Map、Set实现类的源码(2)ReentrantLock和AQS的源码(3)AtomicInteger的实现原理,主要是能清楚的解释CAS机制以及??AtomicInteger是如何使用CAS机制实现的(4)线程池的实现原理(5)Object类中的方法以及每个方法的功能其实要求还是挺高的。我基本上把JDK中重要类的源码都研究了个遍,真是费时费力。当然,回过头来看,还是值得的——不仅仅是为了面试。最后,如果你有兴趣,有时间,建议学习学习SOA和RPC。面向服务的系统是大规模分布式架构所必需的。