两家“神奇”公司的超详细面经(附答案)

华为

华为让我感到神奇的是,额,可以先不用笔试,就可以去参加面试,然后你再回来补一个笔试;还有就是华为的面试感觉特别水,几乎没问什么东西;

一面

  1. 自我介绍项目介绍

    答:自我介绍和项目介绍都和前几篇差不多;这里不再重复;

    美团超详细面经(附答案)

  2. 额,我介绍完以后关于我的项目和自我介绍啥也没问,直接来了一句,你六级过了没?

    答:过了。。。出乎我的意料。

  3. 成绩单带了吗,然后我把成绩单给他了.

    答:额。。。华为是我面的唯一一家要看成绩单的 ,感觉华为比较看重学校和你的学习成绩

  4. 这些问完,就给了我一个A4纸,上面有三道题,让我做,第一道题是从A到B 有5个站点 问一共有多少种车票方案,背景是火车。

    答:这个我一看,额,一个简单的数学问题,就是从5个中取2个,有几种取法,然后这里要注意的是,由于是火车,然后我还说了得考虑一下硬卧软卧无座硬座这几种情况,我是每做完一道题就给他讲一下子;

  5. 第二道题目是一个英文阅读翻译的题目,就是给你一长段英文,让你翻译给面试官听

    答:我看了看大体意思讲的是牛顿第一定律惯性定律,就是那个物体在不受力的时候保存静止或者匀速直线运动状态的那个定律,额,这里幸亏高中物理学过,我看了看那段话有些英文单词还是不认识的,然后凭借着高中物理的知识,我把这段话的意思大体说了一下子,然后他点了点头。

  6. 最后一道题目是一道leetcode的斐波那契数列的原题,手写一个代码,送分题!

     1public class Solution {
     2    public int Fibonacci(int n) {
     3        int a = 0;
     4        int b = 1;
     5        if(n == 0)
     6            return 0;
     7        if(n == 1)
     8            return 1;
     9        int i = 2;
    10        int sum=0;
    11        while(i <= n)
    12        {
    13            sum = a + b;
    14            a = b;
    15            b = sum;
    16            i++;
    17        }
    18        return sum;
    19    }
    20}
    
  7. 然后就结束了,让我出去等二面,也没让我问问题,额。。。

二面

  1. 照例自我介绍和项目介绍

    答:和一面一样;

  2. 又问六级过了吗,然后还看我成绩单

    答:过了,当时我忘记带纸质版的了,给他看了一张我让室友拍的照片,哈哈。。。

  3. 没问我其它东西,问我,家是哪的,加班可以结束吗?

    答:可以接受

  4. 华为之前有一个性格测评,然后说我测出的结果是焦虑,问我你最近很焦虑吗?

    答:没有,我感觉挺正常的。。。同时来了一个尴尬而又不失礼貌的微笑

  5. 工作地点选哪里?

    答:我说杭州,他说杭州可能你最后去不了(我内心os,去不了你还问想去哪?)

然后这就二面就结束了,额,,,感觉就是走个流程,当时心里对比了一下华为的面试和其它公司的,感觉华为招人有点随意,我复习了那么多,你就问点这?

签约面

签约面,额,其实就是告诉你你值多少钱,然后会把所有通过面试的人叫过来,然后华为的一个高管应该是讲一下华为的发展,感觉和宣讲会差不多,然后就是提问环节,你有什么问题都可以提出来,然后他来回答你,有挺多人问了问题,其它问题有点忘了,有一个人问题之间记忆犹新,这里和大家分享一下。

  • 我们在官网上选的岗位,进了公司,可能会被分配到其它岗位吗?

    答:大多人是不会的,当时我听到这个回答,有点想笑。。。谁是大多数人,说明还是有点几率,具体大家去体会一下。

华为给你发offer的时候,我这里针对我们学校来说,刚发了offer就叫你去签约了,因为我们学校是网上签约,华为知道了这个消息,说接受offer的,直接现场在网上确认就是,如果当天不接受offer,那么给你几天时间考虑,过期就作废,额,这意味着,在当时9月初的时候,在我们所有人的认知里你必须与华为签约了,不签就代表着没有华为的这个offer了,颇有一种逼签的感觉。

你以为这就完了?我当时也是以为的,直到我昨天收到了一条短信,感觉有点interesting

640?wx_fmt=jpeg

vipkid

vipkid我觉得有点神奇的是,当天下午由于vipkid的笔试和我在远景面试的时间冲突了,于是我没有选择参加vipkid的笔试,但是神奇的是我第二天在邮箱了里面收到一封邮件,邮件里面写得恭喜你通过vipkid的笔试,邀请你于明天xxxxxxxx参加面试,当时看到这封邮件真是给我逗乐了,正好有时间,就去参加面试了。

一面

  1. 自我介绍

    答:照例自我介绍,建议说出自己的优点,我的介绍和之前的一样;

  2. 项目介绍

    答:介绍完项目,没问我项目,然后问基础知识。

  3. hashcode和equals的区别与联系?

    答:equals如果相等,那么hashcode肯定相等,equals如果不相等,那么hashcode可能相等;hashcode如果不相等,那么equals一定不相等;

  4. 接着问了equasl与==有啥区别?

    答:==的话对于基本数据类型,比较的是内容相不相等;对于复合类型来说,比较的是内存的地址是不是一样;equals对于重写了其比较方法的比如说String就是重写了equals的比较方法,比较的是内容,其余的话如果没有重写equals是比较的是内存地址是不是一样。

  5. JDK是什么?

    答:java运行时环境,包含jre,其中有jvm虚拟机,java核心的库等;

  6. JDK1.8和1.7有啥区别?

    答:这个问题感觉经常被问起,1.8中有lambda表达式,函数式接口,接口中有默认的默认方法可以添加一个非抽象的方法;可直接在lambda表达式中访问外层的局部变量;还有一些,这个背下来就行,没有继续深入问的我面试过的。

  7. JVM虚拟机了解吗,我说了解,然后让我讲一讲内存区域划分?

    答:我讲这个块的时候,把我知道的尽量都说了出来,虚拟机分为了方法区,虚拟机栈,本地方法栈,堆,并分别说了方法区是存一些常量和类加载的静态属性,虚拟机栈是每个方法执行的时候会给虚拟机栈加一个栈帧,其中里面有操作数,返回地址;本地方法我就说和虚拟机类似,只不过是执行本地Native方法;程序计数器我说是jvm虚拟机执行下一条指令时,需要从这里读取一个地址;程序计数器方法区和堆是线程共享的,虚拟机栈本地方法栈和程序计数器是线程私有的,除了程序技术器不会发生内存溢出,其它都会发生内存溢出,并说了哪些会发生堆溢出哪些会发生栈溢出;虚拟机栈和本地方法栈会发生栈溢出和内存溢出,其它两个会发生内存溢出;然后再说的堆的时候,把堆分为了新手代,老年代说了一些,新生代的默认比例8:1:1,新生代对象特点朝生夕死,所以采用复制算法,老年代有标记清除和标记整理算法;这里可以看到,我把相关联的尽量多说一些。

  8. 由于我提及了这些算法,他让我讲一讲这三个算法啥意思?答:复制算法:在GC开始的时候,对象只会存在于Eden区和名为“From”的Survivor区,Survivor区“To”是空的。紧接着进行GC,Eden区中所有存活的对象都会被复制到“To”,而在“From”区中,仍存活的对象会根据他们的年龄值来决定去向。年龄达到一定值(年龄阈值,可以通过-XX:MaxTenuringThreshold来设置)的对象会被移动到年老代中,没有达到阈值的对象会被复制到“To”区域。经过这次GC后,Eden区和From区已经被清空。这个时候,“From”和“To”会交换他们的角色,也就是新的“To”就是上次GC前的“From”,新的“From”就是上次GC前的“To”。不管怎样,都会保证名为To的Survivor区域是空的。Minor GC会一直重复这样的过程,直到“To”区被填满,“To”区被填满之后,会将所有对象移动到年老代中,复制算法的关键点就是要把from和to进行交换的特性说清楚;标记清除算法,就是首先进行标记,从GCRoots开始,然后把标记到的死对象清除;标记整理,就是首先进行标记看看哪些是死对象,然后把存活的对象移动到一边,然后把剩余的都清理掉;

  9. 说完这些,由于我提到了GCRoots,他问我哪些可以作为GC Roots?

    答:方法区中静态引用指向的对象,方法区中常量引用指向的对象,虚拟机栈中引用对象,本地方法栈中Native引用的对象。这个有感觉被经常问。。。

  10. 然后问了计算机网络三次握手说一下?

    答:我说我边写边说吧,然后就把下面这个图画了出来,基本我画出来除了方框不太正之外,其它都和下面的图完全一样,这个一定得背下来。

    640?wx_fmt=png

  11. 状态码3xx,4xx,5xx分别代表什么?

    答:3开头代表重定向,4开头代表客户端出来了问题,5开头代表服务器端出现了问题;

  12. 然后问了数据库,数据库引擎innodb与myisam的区别?

    答:innodb是支持事务的是行级锁不支持全文索引;myisam表级锁支持全文索引;大量插入删除操作的话建议用innodb,大量的select操作建议用myisam。

  13. 数据库的特性说一下?

    答:一致性,隔离性,持久性,原子性。

  14. 然后问了我一些linux的常用命令,如何查看文件的大小?

    答:ls -h 可以显示文件大小;

  15. 如何查看内存?

    答:top,和free -h都可以

这些结束以后就完事了,让我去等二面,感觉vipkid全程都是问基础,没有手写代码。。。

二面

  1. 照例自我介绍与项目介绍

    答:和之前一样,没啥差别,额照例只是让我说了项目亮点,反正项目这里是没怎么问。。。可能有一两个问题有点忘记了。。。

  2. 说是java面向对象的特点?

    答:抽象,将一类对象的共同特征总结出来构造类的过程;继承,子类继承父类创建了新的类;封装,把数据和操作封装起来,对数据访问只能通过接口;多态,就是对于同一个消息,做出两种不同的反应,比如说重载和重写,额,这里要注意的就是不要只回答出来名词,而且要说出啥意思。

  3. 上文提到了重载和重写,问我重载和重写的区别?

    答:重载是在同一类中参数列表不同,这里继续说了什么是参数列表,如参数的顺序,参数的类别,参数的个数不一样了,都是重载;重写,是发生在子类和父类中的,方法名和参数名,返回类型完全一样,子类的方法的访问修饰符大于父类。

  4. 讲一讲protected,privated,public,默认修饰符的作用范围?

    答:这个的话参考这个表,这个我当时是把边画边说,把下面的这个表画了出来。

    640?wx_fmt=png

  5. String,StringBuilder,StringBuffer的区别?

    答:这个也是经常问的,我背了下来,都是final类,String长度不可变,StringBuilder,StringBuffer可变,StringBuffer是线程安全的,StringBuilder不是线程安全的,StringBuffer是用synchronized修饰的,所以安全。

  6. 因为我这里提了Synchronized,他就问我这个是如何保证多线程下的线程安全?

    答:这个我就说,每一个对象都有一个对象头,对象头的里面有一个Mark Word,Mark Word里面有一个重量级锁的指针指向monitor对象(监视器锁)所以每一个对象都与一个monitor关联,当一个 monitor 被某个线程持有后,它便处于锁定状态。如果monitor的进入数为0,则当前线程将monitor的进入数设置为1,那么当前线程便成为了这个对象锁的持有者;如果这个数不是0,会去判断当前这个对象锁的拥有者是不是当前线程,如果是当前线程,那么进入数加1,可重入的;然后上述两步都失败了,那么说明是其它线程占据了这个锁,那么当前线程进入阻塞。

  7. 我说完以后,然后问我多线程这里还了解其它关于线程安全的知识吗?

    答:我说了解,volatile,ReenTrantLock,CAS.

  8. 讲一讲volatile的原理?

    答:volatile底层是cpu的一个lock指令它是起到一个内存屏障的作用,这个lock指令可以将当前缓存行的数据写回到系统内存,并令其它CPU里缓存了该内存地址的数据无效。这里的话是有一个缓存一致性的协议,就是其它CPU会去嗅探总线,如果发现这个数据被更新了,那么其他CPU就把这个数据置位无效,然后从主存中去读取这个最新的数据,保证了可见性与有序性。

  9. ReetTrantLock的原理说一下?

    答:我说ReenTrantLock的底层原理是CAS保证的,然后说了一下CAS的原理,CAS主要有三个数据,内存地址,旧值和新值,每次会去读取内存地址的值与旧值就行比较,如果相同就更新,如果不同说明被别人更新了,继续去查询内存地址与旧值进行比较,直到相等,然后才是更新成功。ReeTrantLock的原理的话,主要是利用CAS去更新一个state的状态值,如果状态值是0,且CAS成功更新状态值为1,那么就获取了锁;如果状态是1的话,会先尝试自旋一次,也就是再去看看这个状态时是不是0,尝试更新它,这个自旋是也不耗费多大时间,就是试一试;然后继续失败,那么通过判断这个锁的拥有者是不是当前线程,如果是,那么通过CAS去更新状态值加1的操作。如果不是进入阻塞。

  10. ReenTractLock和synchronized,有什么区别,具体哪个时候应该用哪个呢?

    答:synchronized是关键字,lock是类,lock可以判断锁的状态,synchronized无法判断锁状态;synchronized是不可中断的,是非公平的,lock可公平可不公平,可中断;所以我就说需要中断的时候用ReenTractLock,需要公平锁的时候用ReetTractLock,另外ReenTractLock需要可以设置超时中断,这种需要超时中断的也可以用ReenTractLock。

  11. 集合了解吗,了解,讲一讲HashMap?

    答:这个hashmap真的是每家必问,hashmap我讲了hashmap的数据结构数组链表结构,讲了hashmap的put,get,扩容的底层原理,讲了hashmap不是线程安全的,以及它为什么不是线程安全,举了在多线程下插入,扩容带来的非线程安全的例子;同时讲了hashmap在1.7与1.8中的区别,put中引入了红黑树,以及扩容的时候不同,这些就讲了挺长时间;

  12. 了解hashTable吗,和hashmap有啥区别?

    答:Hashtable的方法是安全的有synchronized修饰,Hashmap是不安全的;hashtable不可以有null值;HashMap则可以有空值;Hashtable中数组默认大小是11,而Hashmap默认大小是16,;扩容的时候hashtable是乘以2加1,而hashmap是乘以2,大体就说了这些。

  13. 刚才也说了HashMap是不安全的,那么有一个安全的ConCurrentHashmap,讲一讲它是如何保证安全的?

    答:它的底层中,是一种分段锁的方式保证安全,就是每一段上一个锁,然后这样段与段之间是可以同时访问,然后get方法的话,源码是没有使用任何的安全关键字的保证了安全。首先我说了数组链表里面的链表结构,

    1static final class HashEntry<K,V>{
    2    final K key;
    3    final int hash;
    4    volatile V value;
    5    final HashEntry<K,V> next;
    6    //。。。
    7}
    

    可以看到是final修饰的无法修改,所以一旦链表的next有值以后,是无法修改的,所以插入的话肯定是得从头部插入。然后我就把get的这段源码大体写了一下

     1V get(Object key,int hash)
     2{
     3    if(count != 0) //注意这里 1
     4    {
     5        HashEntry<K,V> e = getFirst(hash);
     6        while(e != null) {
     7            if (e.hash == hash && key.equals(e.key)) {
     8                V v = e.value;
     9                if (v != null)  //注意这里 1
    10                    return v;
    11                return readValueUnderLock(e);
    12            }
    13            e = e.next;
    14        }
    15    }
    16    return null;
    17}
    

    ,注意其中1和2处,因为多线程的话无非是增加删除和修改,所以从这三个方面介绍它的get方法为啥是安全的,1.修改的话由于value的值是volatile是保证可见的,所以不影响;2.在注释1和2之间其它一个线程增加了一个节点,由于hashEntry是final修饰的,所以是只能通过头插法插入,在我的注释下的1和2之间另一个插入了新的节点,这时候当前线程去get,如果另一个线程刚好new 这个对象时,当前线程来get它。因为没有同步,就可能会出现当前线程得到的newEntry对象是一个没有完全构造好的对象引用。   如果在这个new的对象的后面,则完全不影响,如果刚好是这个new的对象,那么当刚好这个对象没有完全构造好,也就是说这个对象的value值为null,这个时候也就是代码9-10行所示,需要重新加锁再次读取这个值(第11行代码)!3.如果在注释1之后,删除了一个节点,如果当前线程正好要get这个节点,这个时候由于hashEntry的final修饰,删除节点无法通过修改下一个来保证,所以只能通过复制原来的节点来生成新的链表,而这个时候get的话可能还没有复制完成,依然可以通过旧的链去找到已经删除的节点,这个时候get的话就不具有实时性,但是由于已经删除了,不会暴露什么,所以也是安全的。这里就把get讲了挺长时间,然后其他put的话由于是分段锁的机制,所以原理就是锁的原理,synchronized原理保证安全。

  14. 讲完这里然后就问我,Spring了解吗,将将IOC和AOP?

    答:IOC利用java反射机制,AOP利用代理模式。所谓控制反转是指,本来被调用者的实例是有调用者来创建的,这样的缺点是耦合性太强,IOC则是统一交给spring来管理创建,将对象交给容器管理,你只需要在spring配置文件总配置相应的bean,以及设置相关的属性,让spring容器来生成类的实例对象以及管理对象;AOP技术利用一种称为“横切”的技术,简单地说,就是将那些与业务无关,却为业务模块所共同调用的逻辑或责任封装起来,便于减少系统的重复代码,降低模块间的耦合度,大体说了这些。

  15. AOP代理的原理说一下?

    答:这里我说了AOP的动态代理

    1public static Object newProxyInstance(ClassLoader loader, Class<?>[] interfaces, InvocationHandler h) throws IllegalArgumentException
    

    ,主要是这个代码,用这个方法,然后生成动态代理的类,可以看到这个方法里面有参数InvocationHandler,每一个动态代理类都必须要实现InvocationHandler这个接口,并且每个代理类的实例都关联到了一个handler,当我们通过代理对象调用一个方法的时候,这个方法的调用就会被转发为由InvocationHandler这个接口的 invoke 方法来进行调用

    1Object invoke(Object proxy, Method method, Object[] args) throws Throwable   
    

    ,这个是invoke方法,然后我就继续讲了这个方法三个参数的含义,proxy:  指代我们所代理的那个真实对象,method:  指代的是我们所要调用真实对象的某个方法的Method对象,args:  指代的是调用真实对象某个方法时接受的参数,通过这种方法来实现代理。

  16. 然后接我问我数据结构了解吗,将一讲红黑树?

    答:我大致把红黑树定义说了一下,节点要么红要么黑,从根结点到叶子节点黑色节点数目都是相同的,一个红色节点下面必然是两个黑色节点。

  17. 讲一讲红黑树的插入删除?

    答:额,这个红黑树只了解定义,其它有点忘了,然后来了一个尴尬而又不失礼貌的微笑,然后面试官也跟着笑了。

  18. 然后问我有啥想问的?

    答,我问了问部门是干嘛,他给我介绍了下,然后让我等hr面。

感觉vipkid比较重基础,没让手写代码,全程在一顿说。

hr面

  1. 很常规,就是女朋友,家在哪,加班可以接受不,手上几个offer?

  2. 有个小插曲就是,她问我知道vipkid吗?当时我一听这个,我心里想的,java还有这关键字???然后我说不知道,然后她给我介绍了一下vipkid是干嘛的,我然后才反应过来我面的这家公司就叫vipkid(捂脸笑表情)。

结束语

感觉华为看学历,学历好,面试可能水一些,真批发白菜;其它小公司感觉是重基础。


640?wx_fmt=jpeg3T编程资料等你来拿

640?wx_fmt=jpeg

长按指纹识别二维码关注


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值