程序猿面试宝典

阿里面试经历回顾(两个线程分别打印0-100之间的奇偶数)

2018-04-18  本文已影响42人  4bfeaf8c2970

​第一轮电话面试

年前在朋友的内推下,成功获得了阿里的面试机会,第一轮电话面试记得是约在某一工作日的晚上进行,由于白天一直在忙于工作,确实不方便进行面试,我跟面试官说明了情况,面试官这才答应了在当天晚上8点进行面试(还是感谢阿里面试官的谅解)。当天挂完电话是无比的激动,因为之前压根没有想过能有面试机会,原本以为阿里对简历的要求比较高,不会给我机会进行面试的。当时接完电话那是一个开心的呀,心想一定要好好把握这次面试机会。

当天下班后立马就回到住的地方,晚饭没有吃,随便搞了点零食吃,生怕时间赶不上,于是在那坐等面试官来电话。我就这样坐等着时间一分分钟过去,终于等到8点,此时手机铃声响了(阿里面试人的时间观还是非常不错的),接到电话,那头就跟我说他是谁谁谁,负责这轮面试的,然后大家相互客气的进行了问候下,然后面试官就开始正式的面试。第一个问题就是,让我做一个简单的自我介绍(这些都是套路,基本上所有面试的第一个问题都会先让简单自我介绍),我非常有礼貌地简单做了下自我介绍,主要讲一下自己的基本信息情况,简略说了下这些年待过的公司和参与过的项目。

自我介绍完后,就会对简历上写的项目进行提问(一般只会问你目前做过的项目,几年前的项目,我想应该也没必要问了,毕竟时间隔了那么久,谁也记不了那么清楚),我也说了下目前做的项目的业务场景,和自己承担的职责。

项目问完后,下面就是一系列的纯技术问题,我这边总结了下大致问我的一些技术问题,希望大家可以有所准备。

HashMap底层结构相关问题

线程池的实现原理

JVM性能调优

问我有没有遇到过线上OOM问题,问我是如何排除并解决的

用过MQ? 讲一讲底层实现机制

设计模式相关,比如你用过哪些设计模式,然后讲下UML(一般都会问)

自定义一个java.lang.String 可以被加载么?

以上是大致问我的一些技术相关问题,貌似就这个问题“有没有遇到过线上OOM问题,问我是如何排除并解决的“ 没有回答的很好,其他几个都基本上没问题。

面试官觉得问的差不多了,就问我有没有什么想问他的? (出于礼貌面试官都会这样问下) ,当时我就问了下我目前应聘的这个岗位的主要负责的业务和所涉及的技术,然后面试官也很细心地对我进行解答。回答完后,就说今天这次面试就到这里先结束了,如果有消息会这几天通知您。 我回答说好,谢谢,耽误您这么长时间,非常不好意思。(这也是一种态度和礼貌的表现)

面试官说本来面试是预计半小时的,没想到竟然从8点面到9点多,说明面试官对我还是比较感兴趣的~

总结:第一轮面试个人觉得自我表现还是不错的,除了说话有点紧张外(还是以平常心去面对,不用太在意,这样也许会发挥的更好),当时挂了电话,我心里想着应该会有下一次的面试机会吧。

第二轮电话面试

过了一个周末,第二周周二收到了来自阿里的第二轮面试安排邮件,跟我当时面试后的预感差不多,不过没想到这快;这次面试安排还是比较周全,提前告知我面试时间,记得就是年前我回家前一天,周四的下午2:00,这样我也有一些时间做准备,不至于太突然,中间这几天也准备了一些。为了可以准时赴约,我还特地请了一天假(总不能在公司面试吧),准备的过程中一直都比较兴奋、激动,心想这次可能会问我什么问题呢?

怀揣着激动与彭拜的心情,终于到了周四那一天,中午吃完午饭,睡了一觉,等待2点准时面试。当我等到2点的时候,并没有电话过来,继续等了10分钟后,依然没有电话过来,心里有点不安,难道是忘了今天的面试么?我可是特意请了一天假来面试的呢,不会吧。我当时这样安慰自己,可能是人家面试官刚午睡完,需要缓一缓,于是乎我就继续等待,又过了20分钟,也就是等到2:30的时候,依然没有电话,心想可能真的忘了这次面试的安排了,心中一丝凉意。 当天本来天气并不怎么好,全身还是有点微冷。坐了会儿正准备躲被子继续睡觉的时候,突然电话铃声响起,拿起手机,看到来自于杭州的电话,心中无比的激动,接通了电话,声音那一头是一位声音比较浑厚的男子(下文称为傲视),听说话的声音,能感觉出来这次面试的人应该是招聘部门的老大,跟第一次面试的人语气全然不同(第一次面试可以明显感受出,问的问题都是经过实现准备并有一套流程),而这位老师谈话语气能感觉出比较随意,下面讲下这次面试的主要流程:

首先,简单自我介绍,跟第一轮差不多

其次问项目情况 

根据是你的自我介绍和简历上写的技术针对性问,比如我简历上有一个TPP-ORDER项目用到一个分布式任务调度框架xxl-job ,可能老师并不知道这个框架,于是就问我有那么多开源的分布式任务调度框架,为什么选择这个? 其实我有了解过确实有其他的开源任务调度框架,但是当初选择这个真的要说些什么原因的话,我还真不知道如何去描述,当时我就说了xxl-job的几个特点。其实这一题回答的不是很好。

再次问一些技术问题

1 线上项目遇到过OOM异常么,如何解决的? 

2 如何避免内存泄漏 

3 请讲出你所知道的哪几种内存溢出 

这里可以根据jvm内存区域分别讲讲 比如堆这块会出现堆内存溢出。

在线笔试

电话里讲了半小时后,老师问我身边有电脑没?当时也是非常自然地回答说,有的,然后他说我给你邮箱发一个链接,给你出几个题目。我当时心里地第一反应就是,oh my god。还有这种操作么? 完全没有想到竟然有在线笔试这个幻觉。口头上还是立马说好的呢。 打开QQ邮箱中的连接,是一个很简单在线考试界面。

打开了界面后,老师出了一套编程题

编程题1:用两个线程分别打印0-100之间的奇偶数。 

比如 有A,B两个线程; 

A线程打印1,3,5,7,9 … 99 

B线程打印0,2,4,6,8 … 100

然后控制台输出按顺序输出0-100, 如 0,1,2,3,4,5,…. 100

当时看到这题目立马就有了一个思路,利用synchronized 互斥锁,wait和notify 进行组合,经过一番思考调试后,总算是成功实现效果,代码如下所示:

package com.xyq.maventest.alibaba;/****

* 两个线程分别打印0-100之间的奇偶数

* @author youqiang.xiong

*

TODO 简单描述此类的用途

* 2018年2月25日下午6:18:34

*/public class ThreadPrintData {

   private static Object lock = new Object();    private static int i = 0;    private static int wait = 1;    private static final int TOTAL = 100;    public static void main(String[] args) {

       Thread thread1 = new Thread() {            public void run() {                while (i <= TOTAL) {                    synchronized (lock) {                        if (i % 2 == 1) {

                           System.out.println("thread1  " + i++);

                       } else {

                           lock.notifyAll();                            try {

                               lock.wait(wait);

                           } catch (InterruptedException e) {

                               e.printStackTrace();

                           }

                       }

                   }

               }

           }

       };

       Thread thread2 = new Thread() {            public void run() {                while (i <= TOTAL) {                    synchronized (lock) {                        if (i % 2 == 0) {

                           System.out.println("thread2  " + i++);

                       } else {

                           lock.notifyAll();                            try {

                               lock.wait(wait);

                           } catch (InterruptedException e) {

                               e.printStackTrace();

                           }

                       }

                   }

               }

           }

       };

       thread1.start();

       thread2.start();

   }

}123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263

启动main方法,Console打印如下结果:

请点击此处输入图片描述

如结果所示,线程1,线程2分别间隔打印出0-100的奇偶数。

编程题2:编写一个算法实现倒序输出一个字符串,比如输入hello world,输出dlrow ollel.

这个题目实在是条件单了,即使刚学java的人都会写了。

两种实现方式

/*

* 字符串反转的两种方法

*/  public class TestReverse {  

   public static void main(String[] args) {  

       String str2 = "Hello";  

       str2 = new StringBuffer(str2).reverse().toString();  

       System.out.println(str2);  

       String message = "Hello";  

       StringBuilder rev = new StringBuilder();  

       for (int i = message.length() - 1; i >= 0; i--){

           rev.append(message.charAt(i));

       }

       System.out.println(rev.toString());  

   }  

}  1234567891011121314151617

跟老师反馈说两道编程题已编写完成,然后老师看了会,就打电话过来问到说,你的第一道题利用synchronized 加锁效率在高并发情况下效率会比较差 ,我思索了下确实是,然后老师问我可以进行优化么?我当时一脸懵逼,然后支支吾吾地说,我试试看,其实当时内心本身就很紧张,加上以前实际工作中确实对于多线程编程接触的并不多,突然问我如何优化,一下子把握给懵逼了,后来支支吾吾地说了下可以利用乐观是,cas机制,然后他让我写出来,当时真的是特别紧张,临时写还真的不知道怎么写。(如果是工作中真遇到这个问题,肯定可以写出来),在那种环境下确实就没写出来,后来就如实跟老师交代说,知道用什么方法,但是现在比较紧张,状态不好,暂时不知道怎么写具体的代码实现。后来老师回了句,哦,你工作中这块的接触的不多吧,我如实回答确实是,平时工作中多线程写代码并不多。后来老师就没有说什么,就问我有没有想问他的。 我这时候脑子里立马浮现的问题,就是您目前工作中都需要哪些技术,我说我可以往这方面多去学习,我是十分相信我的学习能力的。后来他大致说了下 他们目前所涉及的技术。 最后老师说到,这次面试的先到这里,无论面试结果如何都会有邮件通知,然后我礼貌回答到谢谢。这次面试就此结束了。

总结: 这一轮面试的感觉还没有第一轮面试感受好,虽然大部分的问题都能回答出来,但是回答的都不是那么全,尤其是后面的在线编程题,如果当时能立马这段代码进行优化的话,那么这轮面试应该就差不多过了,自我感觉这次面试的通过率不高,虽然前后面试加起来也有1个多小时,不过心想没出结果之前应该还是有希望的,毕竟也跟我聊了这么久,不至于一个优化问题没回答出来,就给我挂了吧。面试完第二天我就收拾行李回家了。

备注: 对于编程题1 哪位大神有优化的思路,欢迎留言。

面试结果

回家后上班的那一周的,也没有收到任何阿里的面试反馈邮件,当时的想法是可能都快放假过年了,应该年前不会处理了。后来过完年回到公司,又过了几天依然没有收到阿里的邮件反馈,心想是不是真的挂了? 但是第二轮面试官跟我明确说了,不过是否通过,都会收到邮件的反馈的呢;至今没有收到邮件,也想过是不是人家太忙了忘了,后来我还是忍不住找内推我的朋友,问了下具体面试情况,后来他等了一会儿(估计这会儿应该是去打听我的面试情况),回复了我:说应该是挂了,叫我继续加油,好好修炼内功。 听到这个回答,内心有点小失落。 不过也没有关系了,毕竟当时面完试的时候 我早有预感,做好了心理准备,只是想得到一个明确的答案,心中也算了切一事。

收获

虽然这次面试以失败而告终,但是整个备战的过程中,也让我学到了不少东西,包括技术和态度上。 同时也认识到自己的不足,因此我会时刻在以后的生活和工作中提醒自己,一定要多看书,持续学习。因为深在IT技术这一行,如果你一直满足于现状,仅仅只用已有的技术做一些重复的事情,那么你的技术水平只会停滞不前,以后等你到了中年的时候,自然就会遇到所谓的中年危机。为了在多年以后,自己还能保持竞争力,唯有一直学习。

我自己也是去年下半年意识到以前工作很多时候只是为了解决工作的问题,并没有花太多时间去扩充自己的技术知识,当我意识到我的工作目前做的事情都是一些重复性的业务性工作时,我也会

学习计划

我从大学开始一直都是学的java编程开发,所以后续的学习计划还是以深入java技术为主,毕竟我不想java还有很多未精通的,又去学习其他的语言,希望自己也能做到术业有专攻,再去了解其他的一些新技术(AI、大数据、区块链、物联网),能做到人家谈这个技术的时候,你知道人家在聊什么就可以了。

在这里给讲下我看过的书籍或者准备去看的学习书籍,希望对大家有所帮助 。

深入理解Java虚拟机:JVM高级特性与最佳实践

经典算法大全

剑指offer

计算机组成与体系机构-性能设计

大话设计模式

阿里巴巴Java开发手册

Java 并发编程实战

《淘宝技术这十年》完整版 带批注

经典SQL语句大全

Thinking in UML

虽然感觉书本有点多,其实只要每天都花时间去看,长此以往坚持下来,这些书也用不了多长时间就可以看完,过完年回来的两天时间我就把阿里巴巴Java开发手册 看完了,里面分门别类讲述了如何编写优雅规范的java代码,建议大家有时间一定要去看看,再对比自己平时写的代码,相信一定能从中收获不少。

上一篇下一篇

猜你喜欢

热点阅读