目录:

01 面试经验分享(阿里落榜+美团面试题)

02 面试美团,应该具备什么样的能力?

03 如何快速提升自己,通过面试?

写在开头

成长背景:

先说一下个人的一个成长背景吧。出身江南小镇,大学没有出省,毕业之后就去了上海,在一家互联网金融工作,到去年年底整整两个年头。辞职之后运气不太好,碰到疫情肆虐,现在快步入3月月末了,实际上早早就已经在面试了,截止目前的结果,三面阿里已经“落榜”,后来拿到了一个内推的机会,4面揽下了美团offer。

面试感受:

这次面试下来,给我的感受只有一个,大厂不愧是大厂,阿里的面试还是挺难的,没有那么容易进,面试的几个环节下来,可以说是人才济济,自己感觉还挺自卑的,不过我也不是一个不自信的人,所以面试美团还算顺利,美团的发展还是挺快的,整场面试下来还是相当精彩的!


01 面试经验分享(阿里落榜+美团面试题)(点击此处获取本文文档的完整版

(1)阿里巴巴三面面试题(部分题):

  1. String和StringBuffer的区别

  2. gc的概念,如果A和B对象循环引用,是否可以被GC?

  3. Java中的内存溢出是如何造成的?

  4. String s = “123”;这个语句有几个对象产生?

  5. Error、Exception和RuntimeException的区别,作用又是什么?

  6. 列举3个以上的RuntimeException

  7. reader和inputstream区别

  8. hashCode的作用

  9. Object类中有哪些方法,列举3个以上(可以引导)

  10. char型变量中能不能存贮一个中文汉字?为什么?

  11. 列举几个Java Collection类库中的常用类

  12. List、Set、Map是否都继承自Collection接口?

  13. HashMap和Hashtable的区别

  14. HashMap中是否任何对象都可以做为key,用户自定义对象做为key有没有什么要求?

  15. interface 和 abstrat class的区别 是否可以继承多个接口,是否可以继承多个抽象类?

  16. 启动一个线程是用run()还是start()?多线程有几种实现?同步和并发是如何解决的?什么叫守护线程,用什么方法实现守护线程(Thread.setDeamon()的含义) 如何停止一个线程?解释是一下什么是线程安全?举例说明一个线程不安全的例子。解释Synchronized关键字的作用。当一个线程进入一个对象的一个synchronized方法后,其它线程是否可进入此对象的其它方法?

  17. 了解过哪些JDK8的新特性,举例描述下相应的特性?

  18. 对sql进行优化的原则有哪些?

  19. servlet生命周期是生命与cgi的区别?

  20. StringBuffer有什么优势?为什么快?

(2)美团四面面经:

一面:

  1. 自我介绍

  2. 项目介绍及其亮点

  3. Java的8种数据类型有哪些?

  4. 问了Integer缓存数据的范围?

  5. 紧接着问了Object类有哪些方法?

  6. 问到这里然后拿出了一个题,面试官有小纸条,题目在上面,String A = "123"; String B = new String("123");,问生成了几个String对象?

  7. 由于提到了wait,顺带问了wait和sleep有什么区别?

  8. 由于还提及了hashcode,面试官接着问我,hashcode用在哪里?

  9. 果不其然,面试官说,讲一讲hashmap?

  10. 这里提及了hashMap是非线程安全的,面试问我为啥不是线程安全的,举几个例子?

  11. 我本以为要接着问ConCurrentMap,额,出乎我的意料,并没有问,可能觉得我hashmap准备的很充分,然后接着问了我JVM了解吗?

  12. 让我说意思JVM的分为哪几块?

  13. 由于提及到了内存溢出,面试官问我内存溢出和内存泄漏的区别?

  14. 这里问完我就去问了数据库,4大特性是啥,举个例子?

  15. 数据的隔离级别有啥,每个隔离级别举个例子?

  16. 接着问我计算机网络,问了我7层有哪7层?

  17. 接着问了我TCP在哪层,UDP在哪层,HTTP在哪层?

  18. 问到这里就结束了,然后面试官问我有啥想问的,我就问如何评价我的面试表现?

二面:

  1. 自我介绍

  2. 项目介绍,及其亮点介绍。

  3. 然后问了我集合了解吗,让我说话ArrayList和LinkedList的区别?

  4. 继续问我linkedList可以用for循环遍历吗?

  5. 介绍一下ConCurrenthashmap

  6. 来看看这道题,说着拿出来一个小纸条

  7. 然后问我单利模式了解不,写一个单例模式?

  8. 接着问了我虚拟机了解吗,介绍一些虚拟机的内存模型?

  9. 介绍一些你了解的垃圾回收算法?

  10. 问到这里,问了我你知道SurvivorRatio这个参数为啥初始是默认的8:1:1吗?

  11. 突然又问,二叉树了解吗,写一个二叉树的深度搜索遍历?

三面:

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

  2. 上来就让我手撕一个单例模式

  3. 让我讲了讲代码是啥啥意思?

  4. 由于我的项目中提及到JVM,所以给我出了一个场景题,垃圾会收器中,标记清除多次后,由于采用的是标记清除算法,那么你觉得可能会出现什么问题?

  5. 这里提及到了full gc,问我,哪些情况会产生full GC,哪些情况产生minor GC?

  6. 除了你项目中的内存溢出问题,你还知道哪些关于内存溢出内存泄漏的?

  7. 然后给我出了一个动态规划的手写代码题,说来写个代码吧,大体是在n*m的矩阵方格中,找一个最大的正方形是几乘几的,有点忘了。

四面(HR面):

  1. 自我介绍啊

  2. 为啥想来美团啊,对美团了解多少?

  3. 心中的互联网公司排序

  4. 腾讯和美团选哪个啊?

  5. 自己的优点和缺点

  6. 还有什么问题

美团面试题答案+解析:


02 面试美团,应该具备什么样的能力?

(1)扎实的基础知识:语言基础+计算机基础+算法+基本的Linux运维

想要面试一线互联网大厂,那么最基本的就要是熟练掌握基础知识。首先Java语言,需要你对集合类、并发包、IO/NIO、JVM、内存模型、泛型、异常、反射等都有一个比较深的了解,想要让自己更有优势一些,最好是源码部分也要读过一些。

社招岗位,大部分都是中高级职位,所以这部分的职位要求是比较高的,而且很重视面试者对虚拟机的掌握,比如类加载机制,内存模型等等,这几个方面在优化和并发编程中都非常重要。

至于算法,基本一点的就是排序和查找算法,另外对递归、分治也要有一定的掌握,推荐可以读《算法的乐趣》《Leetcode算法》

除此之外,计算机基础,如TCP/IP协议和操作的知识储备也是必须要有的,这些是作为一个开发的基础条件,也是大学的基础课。

(2)造轮子的能力:设计模式+各种缓存和数据库的应用+中间件技术+高并发和高可用的分布式系统设计

大型互联网公司每天要面对海量的请求,都会考察分布式系统的架构和设计,如何构建高并发高可用的系统,另外因为用户基数比较大,一个细微的优化可能会给带来很大的收益,所以对一些技术栈的掌握要求都比较深入。

比如对MySQL数据库,需要知道相关的配置和优化,业务上来以后如何分库分表,如何合理的配置缓存,一个经验丰富的服务端开发人员,也应该是一个称职的DBA。

对常用的开发组件,比如中间件,RPC框架等都要有一定的了解,虽然工作中可能用不到我们自己造轮子,但是掌握原理才会得心应手。这部分知识主要靠工作积累,推荐《大型网站技术架构与Java中间件实践》,还有曾贤杰的《大型网站系统架构与实践》,里面对大型网站的演变,服务治理和中间件的使用做了很详细的阐述。

作为业务开发人员,有必要了解压力测试相关的指标,比如QPS,用户平均等待时间等,可以帮助你更好的了解自己的系统。

(3)软性指标:快速学习的能力+良好的沟通能力+对相关行业的了解

除了基本的技术要求以外,大型的互联网公司招聘时,还会看重一个人的学习能力,鉴定这个人是不是值得培养的人。比如沟通习惯、逻辑分析能力等等,这些都包含在内,而这些能力是很难段时间去提高的,是长期的积累。

另外,对相关行业的了解程度也是能够加分的,比如互联网金融类的公司,就会更倾向一些拥有过支付和银行相关的系统开发经验的人。

03 如何快速提升自己,通过面试?

(1)了解主流互联网公司的技术栈,梳理好相关的知识点

很多人面试一线互联网,失败的主要原因其实就是对这些公司的技术找要求不了解,也不知道面试时会问到哪些方面?所以提前做一些功课是很有必要的,关于主流互联网公司的技术栈,我自己也有一些整理,这份文档能够很好地帮助你梳理这些技术栈,以及面试会问到的知识点。


(2)适当了解一些产品或设计的知识,以点带面,成为复合型人才

优秀的开发人员,多多少少都要拥有一些产品或设计的相关知识,有利于理解产品经理所要功能之外的根本需求,对产品的研发和开发更有帮助。

要成为复合型人才,对实战研究也要有所知,关于实战问题,我也整理了不少文档,如redis实战、SpringBoot核心笔记等。

  • 以SpringBoot 核心笔记为例:

(3)刷一刷历年来的大厂面试题(包括HR面)


写在最后

对程序员来说,很多技术的学习都是“防御性”的。也就是说,我们是在为未来学习。我们学习新技术的目的,或是为了在新项目中应用,或仅仅是为了将来的面试。但不管怎样,一定不能“止步不前”,不能荒废掉。

现在行动,你还来的及!

文章以上内容中涉及到的所有PDF文档,大家戳传送门