今天面试了一个2年Java经验的
今天去面试了一个26岁的程序员,看了简历,2年经验,本科,写得很牛叉。
Spring cloud alibaba全家桶、redis,分布式锁,服务调用,数据库事务,线程,Zookeeper、Dubbo 、RabbitMQ,Kafka 都懂。
做的项目也是这类微服务的内容有关。
我同事做算法的,算法工程师,他和我一起去面试,因为面试Java,他建议我问几个简单的加一个难的。我说他写得那么牛,我不问深一点,貌似对不起自己。他笑了,回我说也是。
以我过往的经验,把自己写得很牛×的人,大部分都是一知半解的人,所以凡事还是从细节来把握,看看真实水平如何。
1、简述HashMap的数据结构??
他基本就答不上来。
在JDK 7和以下,它是一个数组+链表结构。JDK8和以后,它是一个数组+链表or红黑树结构,当链表深度达到8以上之后,就会构建红黑树,而红黑树达到深度6后,就会进行重构。
首先先计算key的hashcode,然后确定在数组的位置,然后在把元素连接到链表或者红黑树中。
HashMap加载因子是0.75,默认容量是16,当满足16*0.75=12时,就进行重构HashMap结构,这个时候就会比较消耗时间了。所以我们应该尽可能避免这样的事情发生,尽可能第一次分配好空间,以避免重构。
2、HashMap和ConcurrentHashMap的区别是什么??
他也几乎没有反应,把他问蒙了。
HashMap不是线程安全的,而ConcurrentHashMap是线程安全的,只是它的加锁范围较小,适合在高并发下使用。
ConcurrentHashMap是一个线程安全的Map,JDK8之前它的内部在默认的情况下拆分为16个segment(类似HashMap结构),之后是红黑树,允许使用CAS乐观锁,针对某个区域(JDK8之前的segment)加锁,其他的不加锁,所以是一个局部加锁的机制,提高并发能力。
3、Feign进行服务调用,为什么给出服务名称,就能调用??Feign是如何获取服务清单的??
他回答:服务注册给服务治理中心,服务治理中心再告知服务实例。
我提示他说:你应该从服务治理的原理和服务获取的概念来谈。
他表示不太懂。
其实他基本又错了。首先服务在启动时,都注册给服务治理中心,服务治理中心会根据服务名称维护一份服务清单,每个服务节点都要定时续约(向服务治理中心请求告诉服务治理中心我还活着),不能按要求完成续约的就被服务治理中心剔除。而某个服务节点,每隔一段时间(一般是几秒钟)都会向服务治理中心拉去最新服务实例清单,这个过程叫做服务获取,然后缓存本地副本,提供给Feign客户端调用时使用。
ps:本来我还想问断路器的,我看他肯定又不知道,还是算了。
我想好吧,我觉得他写得东西,虚的比较多,那么我开始考虑问些比较基础的,毕竟人家也好歹2年工作经验。于是就稳点基础一点的吧。
4、数据库事务隔离级别有哪些??会产生哪些问题呢?
这个他比较好,能回答。
未提交读(脏读)
读写提交(不可重读)
可重复读(缓读)
串行化(克服所有的问题)
我在问:一般情况下,采用那个级别就够了??
他回答:可重复读。
我说:错了,一般来说,我们会采用读写提交。
5、Spring AOP是通过动态代理模式来完成的,你能告诉我有哪些通知?执行的顺序是怎么样的吗??
他只能告诉我有哪些通知,包括:前置通知、后置通知、环绕通知、事后通知,返回通知和异常通知。顺序他搞不清楚了。
AOP,执行顺序前置通知、目标方法(环绕通知),如果发生异常执行异常通知,如果没有发生异常执行返回通知,最后执行事后通知。
其实,和我的预测差不多,把简历进行包装,只要面试官认真问些细节的问题,就要露馅了。
我同事问的算法题,他也不太懂,估计要把他给PASS了。