最新阿里面试总结,想跟程序员们谈谈

283 阅读10分钟

前言:

作为一名有4年工作经验的程序员参加面试的心酸历程。在过去的3年里,我一直致力于提升我的技术能力和扩展我的知识领域。我在不同的项目中积累了丰富的开发经验,并与团队成员紧密合作,共同解决了许多技术难题和挑战。

前三年,一直是待在字节跳动做后端开发,由于自身的原因,选择在今年四月份离职回了杭州,在回杭州的这差不多一个多月里,也投递面试了些许大大小小公司,也收到了很多的offer,其中就有今天要说的阿里巴巴。

去阿里面试,其实是内推去面试的,跟我同校的学长在得知我回杭州后,也是第一时间联系上了我,也跟学长聊了这些年在工作上学习成长历程。也跟学长聊了很多技术上的学识(程序员见面多许都会聊到技术上的一些学识见解吧~~)也得到了学长的认可。就非要我去阿里试试,说给我做个内推。抵不过再三邀请,只能厚着脸皮去试试。结果误打误撞,还拿到了OC,这也是我没想到的。(其实自我感觉自己的技术还差点意思,还有很多需要学习以及提升的地方)。

其他的就不再跟大伙多说什么了,毕竟要说的话很多,不差这一时半会。下面我把我去阿里面试的经历跟大伙分享,以及阿里面试要问的面试题(不知道这是不是阿里喜欢问的面试题,但总的来说,面的大多数都是基础以及聊得最多的就是项目和并发这一块。也有可能是我简历的原因)。

面试题答案我就不一一写出来了,因为内容太长,且时间也很紧凑。,后续我把简历模版以及我的学习资料,到时候我打包一起分享给大伙。(因为不能直接给你们发资料,所以只能拜托博主帮我分发下了。)

OK,也不多说了,下面直接上干货

面试前准备工作

在准备阿里巴巴Java后端面试之前,以下是我给大伙的一些建议的准备事项:

  1. 了解阿里巴巴:深入了解阿里巴巴的业务、文化和技术栈。研究阿里巴巴的产品、解决方案和创新项目,以便在面试中展示你对公司的兴趣和了解。

  2. **技术知识准备:**复习Java核心知识,包括语法、面向对象编程、集合框架、多线程、IO等。熟悉Spring框架和常用的ORM框架,如MyBatis、Hibernate。了解分布式系统的原理和微服务架构的设计。

  3. **数据库和存储技术:**熟悉关系型数据库(如MySQL、Oracle)和NoSQL数据库(如MongoDB、Redis)的基本概念和使用方法。了解数据存储和缓存技术,如分布式文件系统和分布式缓存。

  4. **Web开发技术:**了解常用的Web开发技术,如HTTP协议、Servlet、JSP、RESTful API等。熟悉前后端分离开发模式和常用的前端框架,如React、Angular、Vue.js等。

  5. 分布式系统和大数据技术**:**了解分布式系统的基本概念和原理,熟悉大数据处理和分析的技术,如Hadoop、Spark、机器学习等。

  6. 面试题准备:复习常见的面试题,并准备针对性的答案。涵盖技术问题、算法和数据结构、系统设计和架构等方面。还可以参考阿里巴巴以往的面试题和技术博客,了解他们对技术和问题解决能力的关注点。

  7. 项目经验总结:回顾自己的项目经验,特别是涉及到架构设计、性能优化和解决技术挑战的项目。准备好相关的项目介绍和技术细节,以便在面试中展示你的实际经验和解决问题的能力。

  8. 自我反思和沟通技巧:思考自己的职业发展规划和技术能力的提升点,准备好回答面试官可能提出的关于职业规划和技术发展的问题。并锻炼自己的表达能力和沟通技巧,以便能够清晰、有条理地表达自己的想法和观点。

  9. 模拟面试和练习**:**与他人进行模拟面试,练习回答面试问题和解决问题的思路。可以参加一些技术交流和讨论会,提高自己的技术表达和交流能力。

总之,准备阿里巴巴Java后端面试需要全面的技术知识储备、项目经验总结以及自我反思和沟通技巧的准备。重点是在准备过程中保持积极的心态和自信的表现。

大致的面试过程

面试日期:2023年5月15日

面试职位:Java开发工程师

初试环节

我收到了阿里巴巴的初试邀请,并在5月15日前往阿里巴巴总部进行面试。初试环节是一轮技术面试,由一位资深的技术专家进行主持。面试开始时,他先介绍了面试的整个流程和时间安排。

技术面试 (总共5面,差不多六个小时左右)

在技术面试环节中,我遇到了几个技术问题,涵盖了数据结构、算法和系统设计等方面。我被要求解释并实现一个常见的排序算法,并分析其时间复杂度。然后,我被提问了一些关于分布式系统的问题,包括一致性协议和负载均衡算法。我尽力清晰地表达我的思路和解决方案,并通过编写伪代码和画图来支持我的回答。

行为面试(30min左右)

接下来是行为面试环节,由一位人力资源专家负责。他向我提出了一些关于团队合作、项目管理和问题解决能力的问题。我用具体的例子回答了这些问题,强调了我的领导能力、沟通能力和解决问题的方法。

面试结果 (后面一周左右我收到offer)

在面试结束后,面试官告诉我他们会综合考虑我的技术能力、个人素质和团队适应性来评估我的表现。他们会与其他面试官进行讨论,并在一周内通知我面试结果。

那下面我们直接开始我们的面试题环节喽~~~~

阿里一面 (二个小时左右)

  • 面试官介绍部门

  • 自我介绍

  • Java中int跟integer的区别?

  • integer在Java中有个缓存的概念,有了解吗?

  • ==跟equals的区别,equals的重写怎么进行比较?

  • 在实际开发中为什么不能用浮点类型来存金钱的数据,浮点类不精确的本质是什么?

  • 构造器能被重写吗?

  • 反射相关:class.forname和classloader的区别?

  • jvm相关:jvm的内存区域相关分布,1.8以上的内存模型 springboot的项目类加载存放在哪个区,内存模型中哪个数据区是内存共享的?gc时为什么需要永久代, 什么情况下会从年轻代存放在老年代,用什么方法或者角度来排查频繁获取fullgc,了解过使用jmap把堆dump下来之后去分析dump文件有了解过吗?

  • 线程相关程序实现过吗?

  • 线程跟进程的区别,他们对资源之间的共享的区别,比如说线程之间哪些资源共享的,进程之间什么是共享的?

  • springboot跟tomcat是多线程还是多进程?

  • 在多进程的通信多有几种数据同步的方式?

  • 多线程的模型中死锁是如何行程的,一般采用什么方式去死锁?

  • volatile保证可见性和原子性的原理

  • springboot IOC和依赖注入,@bean @Autowired和@Resource注解的区别?

  • mybatis#{}与${}的区别?

  • aop应用场景

  • innodb跟myisam

  • InnoDB底层实现,innodb最小单位锁

  • explain命令

  • redis常用数据类型,使用过几个(缓存String,zset排行榜)

  • redis:keys sismember命令时间复杂度

  • redis,zset实现两个维度的排序 (score是double类型:整数部分就是下载量,小数部分就是最后更新时间戳)

  • 有用过消息队列吗,或者有了解吗?

  • 计网:tcp链接为什么四次挥手而不是三次 timewait在第几阶段,为什么要有2msl标志,可以修改它吗?

  • http get跟post的区别 get请求body里能放数据吗?

  • 用到分布式事务嘛?为什么用这种方案,有其他方案嘛?

  • JDK6、7、8 分别提供了哪些新特性?

  • 说一下https 原理,以及工作流程?

  • 讲讲 java jmm volatile 它们的实现原理?

  • 谈谈你对volatile 关键字作用和原理的理解?

  • 讲一讲 7 层网络模型,tcp为什么要三次握手?

  • 说说线程池的工作原理?

  • 你们数据库中的高可用是怎么实现的?

  • 读写分离的场景下,怎么保证从数据库读到最新的数据?

  • 如何保证 MySQL 数据不丢?

  • 高并发下如何设计秒杀系统?

  • 在秒杀场景中,常用的限流算法有哪些?

  • 聊聊五种 IO 模型?

  • 说下hystrix 工作原理?

  • 说下https 请求过程?

  • 聊聊事务隔离级别,以及可重复读实现原理?

  • 聊聊索引在哪些场景下会失效?

  • 说下分布式锁实现?

  • 实现分布式锁,Zookeeper 和 Redis 哪种更好?

谁知道呢?一面就要问这么多问题,现在回想,我也不知道是怎么全部给回答完的

阿里二面(一个小时)

  • 知道哪些数据结构以及他们的特点

  • 链表增删快,那如何提高其查询效率,有没有什么想法?

  • B+树了解吗?B+树如何范围查询?B+树退化的极端情况是什么?

  • 跳表了解吗?

  • 大顶堆、小顶堆了解吗?

  • 实现长地址请求到服务端,然后服务端重定向短地址给客户端,如何实现长短地址的互相映射?

  • 那我现在有10份数据,有1000个线程来争抢,你要怎么处理?

  • 分布式是什么?为什么要分布式?分布式又会有哪些问题?分布式系统是如何实现事物的?

  • Redis集群了解吗?如何处理宕机的情况?Redis的同步策略?

  • LRU算法了解吗?你会如何实现它?这个算法可以应用在哪些场景下?

  • TCP为什么是三次握手?两次行不行?多次行不行?

  • TCP的安全性是如何实现的?两台服务器之间可以同时建立多条TCP链接吗?怎么实现的?

  • 客服端输入一个网址后,是如何拿到客服想要的数据的,是怎样在网络中传输的?

  • cookie和session

  • java有哪些锁?共享锁是什么?CAS?乐观锁和悲观锁?synchronied的底层原理?锁升级?死锁怎么形成的?如何破解死锁?

  • 谈谈类加载机制。

  • hashmap和concurenthashmap

  • 16g机器,让你分配jvm内存怎么分配。

  • 机器慢了怎么排查。

  • 谈谈consul和zookeeper,还有服务发现机制。

  • 详细说明raft协议。

  • 谈谈consul和zookeeper区别。

  • 服务注册的时候发现没有注册成功会是什么原因。

  • 讲讲你认为的rpc和service mesh之间的关系。

阿里三面(过得比较快,40分钟左右)

  • 分布式锁都有哪些

  • 自己怎么搞一个定时调度平台

  • 任务中心这个定时任务怎么搞,怎么分布式搞

  • 一般都是客户端收消息,服务器向客户端推送消息怎么做到

  • 红黑树和平衡二叉树的区别

  • 数据库怎么设计

  • 静态单测方法怎么mock

  • Retreenlock和synchronized 区别

  • ConcurrentHashMap在jdk1.7和1.8的区别

  • Jvm 内存结构,程序计数器干什么用的,每个线程有几个,能不能有2个?

  • 设计模式都有哪些?单例模式什么情况下会被破坏

  • 索引类型,MySQL 为什么用B+树,而不用B-树

  • ArrayList Linklist

  • Redis集群怎么实现负载均衡

  • 了解过那些排序算法 讲一下冒泡和快排实现方式 为什么快排比冒泡快

  • 描述一下NIO

  • mysql隔离级别 分别能解决哪种问题

  • mysql索引,B+树和hash表区别

  • 如果插入1000w的数据 B+树大概会有几层

  • redis介绍

  • redis为什么速度快,那么底层是怎么存储的,如果从100w数据量变成1000w数据量查询时间会加十倍吗 为什么

  • JVM内存结构

  • 看你用过dubbo介绍一下

阿里四面(一个半小时左右)

  • 自我介绍,说简历里没有的东西

  • 说几个你最近在看的技术(MySQL,多线程)

  • 口述了一个统计数据的场景题

  • 如果这个统计数据场景不用MySQL,而是用Java来实现,怎么做

  • 如果数据量过大,内存放不下呢

  • 用面向对象的思想解决上面提出的问题,创建出父类,子类,方法,说一下思路

  • 下一个场景,口述了一个登录场景,同学用线程池做登录校验,会有什么问题

  • 如何解决这些问题

  • 你给出的方案弊端在哪里,还有哪些方案

  • HashMap扩容为什么是扩为两倍?

  • Java线程同步机制(信号量,闭锁,栅栏)

  • 对volatile的理解:常用于状态标记

  • 八种基本数据类型的大小以及他们的封装类(顺带了解自动拆箱与装箱)

  • 线程阻塞几种情况?如何自己实现阻塞队列?

  • Java垃圾回收。可达性分析->引用级别->二次标记(finalize方法)->垃圾收集 算法(4个)->回收策略(3个)->垃圾收集器(GMS、G1)。

  • java内存模型

  • TCP/IP的理解

  • 进程和线程的区别

  • http状态码含义

  • ThreadLocal(线程本地变量),如何实现一个本地缓存

  • JVM内存区哪里会出现溢出?

  • 双亲委派模型的理解,怎样将两个全路径相同的类加载到内存中?

  • CMS收集器和G1收集器

  • TCP流量控制和拥塞控制

  • 服务器处理一个http请求的过程

  • 例举几个Mysql优化手段

  • 数据库死锁定义,怎样避免死锁

  • spring的aop是什么?如何实现的

  • 面向对象的设计原则

  • 策略模式的实现

  • 操作系统的内存管理的页面淘汰 算法 ,介绍下LRU(最近最少使用算法 )

  • B+树的特点与优势

本来以为面到这里应该是要结束了,没想到通知说还有一面,说是大佬要亲面

阿里五面(一个小时)

  • 进程线程的区别 [event loop 事件循环 ]

  • 聊一聊缓存 [浏览器缓存+http缓存]

  • 如果浏览器关闭了再打开, 请求还是from cache吗? [浏览器缓存+http缓存]

  • Service Worker 了解过么?

  • 聊一下常见的前端安全问题. [前端安全攻防]

  • 你的网站是怎么阻止 csrf 攻击的? [前端安全攻防]

  • 为什么用 token 就可以防止 csrf 攻击?

  • token 的刷新机制是怎么样的, 为什么这么设置?

  • 讲一下跨域

  • 如何处理项目的异常.

  • script error 怎么捕获

  • 脚手架做了什么功能.

  • webpack做了什么优化

  • webpack原理 [webpack]

  • 维护的公共组件需要发布大更新, 如何做?

  • react 怎么做优化

  • 用 react hook 来实现 class 的几种生命周期.

  • react hook 相比较 class, 哪些不太容易实现?

  • react 原理

  • 聊一下高阶组件 hoc

  • 聊一聊组件设计, 领域模型

  • mobx 和 redux , 为什么选择了 mobx , 技术选型有标准

  • mobx 过于灵活, 如何规范约束

  • mobx 原理与 redux 原理

  • 项目的最大难点是什么? 怎么解决?

  • 聊一下 node 的事件循环.

  • node 架构中容灾

  • pm2 的原理.

  • 有没有读过 egg 源码.

  • 了解过 grahql 么

  • 聊一下微服务

  • 小程序跟 h5 的区别是什么? [小程序底层实现]

  • 讲一下 taro 小程序的底层原理,跟 mpvue 的区别 [AST, babel]

  • SPA 项目如何监控 pv, uv 值

  • 如何在用户刷新、跳转、关闭浏览器时向服务端发送统计的数据?

  • 错误日志上报遇到的问题.

  • 规范 [eslint, prettier, git commit hook]

  • 如何制定规范?

  • 可视化表单了解过么?

  • 聊一下 axios .有什么优点, 跟 fetch, ajax对比

  • axios 为什么既可以在浏览器发请求,又可以在node层发请求?

技术面经过五轮的轰炸,总归是搞完了,但我也顶不住了,经过几轮的面试轰炸,我现在脑袋里全是空的,自我感觉都懵逼了。

建议:肚子里没有点东西,还是不要去阿里面试了,因为还没面完,你都有可能会自我怀疑自己是不是选择放弃这个行业了。

HR面(30min左右)

1:聊了会天,面了这么久,说让我放松下

2:问了下我的家人情况

3:问结婚了么,有没有女朋友?

4:考虑后面都待在杭州么?

5:说说你的职业规划

6:让我说下对996有什么看法?

7:你的个人优劣势是什么

8:什么时候可以入职?

9:还有其他什么offer?

10:反问环节

11:你在工作过程中有没有遇到什么困难,如何解决的

HR面比较普遍的问题,面之前好好准备一下就OK了。

经过这次面试,我总结一下几点:

1、基本语法

这包括static、final、transient等关键字的作用,foreach循环的原理等等。今天面试我问你static关键字有哪些作用,如果你答出static修饰变量、修饰方法我会认为你合格,答出静态块,我会认为你不错,答出静态内部类我会认为你很好,答出静态导包我会对你很满意,因为能看出你非常热衷研究技术。

2、集合

非常重要,也是必问的内容。基本上就是List、Map、Set,问的是各种实现类的底层实现原理,实现类的优缺点。集合要掌握的是ArrayList、LinkedList、Hashtable、HashMap、ConcurrentHashMap、HashSet的实现原理,能流利作答,当然能掌握CopyOnWrite容器和Queue是再好不过的了。另外多说一句,ConcurrentHashMap的问题在面试中问得特别多,大概是因为这个类可以衍生出非常多的问题,关于ConcurrentHashMap,我给网友朋友们提供三点回答或者是研究方向:

(1)ConcurrentHashMap的锁分段技术

(2)ConcurrentHashMap的读是否要加锁,为什么

(3)ConcurrentHashMap的迭代器是强一致性的迭代器还是弱一致性的迭代器

3、设计模式

设计模式在工作中还是非常重要、非常有用的,23种设计模式中重点研究常用的十来种就可以了,面试中关于设计模式的问答主要是三个方向:

(1)你的项目中用到了哪些设计模式,如何使用

(2)知道常用设计模式的优缺点

(3)能画出常用设计模式的UML图

4、多线程

这也是必问的一块了。会问得深入一些比如说Thread和Runnable的区别和联系、多次start一个线程会怎么样、线程有哪些状态。当然这只是最基本的,出乎意料地,几次面试几乎都被同时问到了一个问题,问法不尽相同,总结起来是这么一个意思:假如有Thread1、Thread2、Thread3、Thread4四条线程分别统计C、D、E、F四个盘的大小,所有线程都统计完毕交给Thread5线程去做汇总,应当如何实现?

聪明的网友们对这个问题是否有答案呢?不难,java.util.concurrent下就有现成的类可以使用。

另外,线程池也是比较常问的一块,常用的线程池有几种?这几种线程池之间有什么区别和联系?线程池的实现原理是怎么样的?实际一些的,会给你一些具体的场景,让你回答这种场景该使用什么样的线程池比较合适。最后,虽然这次面试问得不多,但是多线程同步、锁这块也是重点。synchronized和ReentrantLock的区别、synchronized锁普通方法和锁静态方法、死锁的原理及排查方法等等

5、IO

IO分为File IO和Socket IO,File IO基本上是不会问的,问也问不出什么来,平时会用就好了,另外记得File IO都是阻塞IO。Socket IO是比较重要的一块,要搞懂的是阻塞/非阻塞的区别、同步/异步的区别,借此理解阻塞IO、非阻塞IO、多路复用IO、异步IO这四种IO模型,Socket IO如何和这四种模型相关联。这是基本一些的,深入一些的话,就会问NIO的原理、NIO属于哪种IO模型、NIO的三大组成等等,这有些难,当时我也是研究了很久才搞懂NIO。提一句,NIO并不是严格意义上的非阻塞IO而应该属于多路复用IO,面试回答的时候要注意这个细节,讲到NIO会阻塞在Selector的select方法上会增加面试官对你的好感。如果用过Netty,可能会问一些Netty的东西,毕竟这个框架基本属于当前最好的NIO框架了(Mina其实也不错,不过总体来说还是比不上Netty的),大多数互联网公司也都在用Netty。

6、JDK源码

要想拿高工资,JDK源码不可不读。上面的内容可能还和具体场景联系起来,JDK源码就是实打实地看你平时是不是爱钻研了。

JDK源码其实没什么好总结的,纯粹看个人,总结一下比较重要的源码:

(1)List、Map、Set实现类的源代码

(2)ReentrantLock、AQS的源代码

(3)AtomicInteger的实现原理,主要能说清楚CAS机制并且AtomicInteger是如何利用CAS机制实现的

(4)线程池的实现原理

(5)Object类中的方法以及每个方法的作用

7、框架

老生常谈,面试必问的东西。一般来说会问你一下你们项目中使用的框架,然后给你一些场景问你用框架怎么做,比如我想要在Spring初始化bean的时候做一些事情该怎么做、想要在bean销毁的时候做一些事情该怎么做、MyBatis中$和#的区别等等,这些都比较实际了,平时积累得好、有多学习框架的使用细节自然都不成问题。

如果上面你的问题答得好,面试官往往会深入地问一些框架的实现原理。问得最多的就是Spring AOP的实现原理,当然这个很简单啦,两句话就搞定的的事儿,即使你不会准备一下就好了。

8、数据库

数据库十有八九也都会问到。一些基本的像union和union all的区别、left join、几种索引及其区别就不谈了,比较重要的就是数据库性能的优化,如果对于数据库的性能优化一窍不通,那么有时间,还是建议你在面试前花一两天专门把SQL基础和SQL优化的内容准备一下。

不过数据库倒是不用担心,一家公司往往有很多部门,如果你对数据库不熟悉而基本技术又非常好,九成都是会要你的,估计会先把你放到对数据库使用不是要求非常高的部门锻炼一下。

9、数据结构和算法分析

数据结构和算法分析,对于一名程序员来说,会比不会好而且在工作中绝对能派上用场。数组、链表是基础,栈和队列深入一些但也不难,树挺重要的,比较重要的树AVL树、红黑树,可以不了解它们的具体实现,但是要知道什么是二叉查找树、什么是平衡树,AVL树和红黑树的区别。

10、Java虚拟机

Java虚拟机应该是很重要的一块内容,谈谈Java虚拟机中比较重要的内容

ava虚拟机的内存布局

GC算法及几种垃圾收集器

类加载机制,也就是双亲委派模型

Java内存模型

happens-before规则

volatile关键字使用规则

也许这些内容面试无用,但在走向大牛的路上,不可不会。

11、Web方面的一些问题

Java主要面向Web端,因此Web的一些问题也是必问的。

谈谈分布式Session的几种实现方式?(常用的四种能答出来自然是让面试官非常满意的)

讲一下Session和Cookie的区别和联系以及Session的实现原理

这两个问题之外,web.xml里面的内容是重点,Filter、Servlet、Listener,不说对它们的实现原理一清二楚吧,至少能对它们的使用知根知底。另外,一些细节的方面比如get/post的区别、forward/重定向的区别、HTTPS的实现原理也都可能会被考察到。

最后,如果有兴趣有时间,建议学习、研究一下SOA和RPC,面向服务体系,大型分布式架构必备,救命良方、包治百病、屡试不爽。

面试总结:

以上便是完整的面试题经过以及流程和心得总结,虽然说面试的过程很长,问的问题也很多,有些能顺利的答上,也有些是我没答上的。但总归来说,收获还是挺大的。在面试过程中,也受到了大佬们的指点以及建议,对于我来说也是收获满满。

最后,面对于现在Java的行情,最新BATJ以及独角兽这些厂子的面试要求,建议大会还是先提升自己的技术栈,因为不仅仅大厂在招人,同时也在招人。这就说明了适者生存的道理。同时也说明了现在互联网出现断层严重的现象,底层码农待在舒适区的很多,但真正掌握技术的精英很少很少。

所以,如果说你想涨薪且有更高的最求,建议,加紧提升自己的技术栈,2023年就是你实现涨薪进大厂飞跃的一年。

加油,想涨薪想跳槽想提升的码农们~~~~