原作者(小胖儿)是一位2021届本科毕业生,就读于一所双非(非985、非211)院校。
最近顺利的拿到了阿里的Offer,非常为它感到高兴。他还顺便总结了一下自己面试经历,介绍了一下自己是如何准备的,也希望能够给大家带来一些帮助。
以下是他的原文内容,我也对其中的部分内容做了些批注。帮你还原真实的面试现场!
前言
前两天,我收到了阿里巴巴的暑假实习offer,从学长内推开始面试到拿到最后offer经历了4面技术、一面交叉面和一面HR面。经过了漫长的等待和几次几乎折磨的面试之后,终于拿到了暑期实习offer。
面试官标注:阿里的校园招聘一般会经历4-5轮的面试,大概会持续一个月左右,每一轮结束之后到下一轮面试的时间一般不会超过两周,如果等待时间过长,不用着急,可以联系一下自己的内推人,他们可以帮忙查看进度。
自我介绍
本人来自西南某双非本科学校,在校学的专业是物联网工程。我的专业与Java开发关系不大,学校也只教过一些简单的编程课,其余的编程相关知识都是自己在课余时间在实验室学习和自学的。技术不是大牛,项目做得多但是大部分都是自己练手的小项目或者一些有意思的小项目,没有接触过真正意义上的大项目。平时没事的时候喜欢逛一逛微信公众号、简书、掘金等平台,看一看技术类文章,自己也偶尔写过一些文章。在校期间在实验室的时间偏多,喜欢写代码的过程和攻克难题的过程。
学习过程
Java基础最开始是在菜鸟教程和其他的一些教程网站上自学的,后来又通过阅读《Java编程思想》、《Effective Java》、Hollis大神的“成神之路”系列文章等强化巩固Java编程基础。对于Java基础一定要学的扎实,这是编程的基本功,和练武功时候的扎马步一样,虽然枯燥但是必须扎实。
面试官标注:没错,Java基础一定要扎实,这是基本功,如果基础不扎实,基本没有可能通过阿里的前几轮技术面。
框架方面最开始是实验室老师让学习jfinal框架(但是当时看到网上很多地方都在说spring,自己一直没有去主动学习),后来我的人生导师让我去学习SpringBoot和Vue这两个框架,由于之前有框架学习经验,且这两个框架对新手很友好,学习过程很快。当时学习也就是从网上找了几个系列文章一边看一边学,然后在开始学习的两周之内做了一个留言板(做了两版,一般前后端分离,一版使用thymeleaf)。
JVM方面,大二下学期买了《深入理解Java虚拟机》,那时候第一遍阅读,里面几乎所有东西都不懂,后来大三又读了一遍,复习面试的时候又读了一遍,对书中的知识终于有了一点点认识。除了阅读这本书,其他时候还经常浏览一些面经,然后根据面经中的JVM问题来查阅资料,了解JVM相关知识。
Java并发编程,大三从B站上找了一个并发编程的教程,后来自己又买了一本《Java高并发程序设计》,这本书的前半部分看了2、3遍,对高并发有了上一定的认识。
设计模式也是一直在B站上找视频学习,同时网上查阅资料对设计模式进一步理解。
以上就是我的整个大学期间的学习过程,学习过程中也一直在做项目,从项目中发现错误并改正,从重构中找到更合适的解决方式,从调试中发现代码的真正运行原理才是最关键的。
面试准备
首先准备校招之前一定是要好好准备的,长期的就是自己的编程基本功以及对各个方面知识点的了解程度,短期的就是突破一下自己不会的知识点。
我是投简历之前一个半月就开始做准备了,首先就是刷leetcode,算法这一关还是比较重要,而且阿里还有笔试成绩,面试的时候也会问到一些不是太难的笔试题;
然后就是多找几篇面经,看看学长学姐当初面试的时候面试官都问了哪些问题,如果遇到会的,自己尝试回答一遍,如果遇到不会的,那就去学习一下;
不过网上找的面经可能因为大家的学习过程不一样,找到类似的面经的概率个人感觉不太大,我恰巧在H大的知识星球里面,就找H大做了一下简历指导(不是在打广告,是真心感谢H大);
最后还是在H大的知识星球里面找到了一个很完整的Java面试题及答案的文档(付费资源,但是很值)用来做复习资料。
面试过程
第一次技术面(60min)
- 说一说你使用的是什么样的线程池,自定义线程池的几个参数是什么
- 说一说线程池的执行流程
- 你的项目中定义的核心线程数、最大线程数和队列大小是如何定义的?为什么这样定义?(这道题根绝我导师给我说是一个加分项)
- 在项目中如何防止超卖现象
- 你的下订单的sql语句如何编写的?(考察MySQL的乐观锁)
- 如果有用户反馈说整个系统的反馈比较慢,你是如何排查和如何解决问题的?
- 影响系统响应慢的原因有哪些?
- 算法题:给定一个无序数组和一个目标值,找出数组中两个数之和等于目标值的所有组合,并指出其时间复杂度。(很简单的一个算法题,leetcode easy难度)
- 了解过JVM内存模型么?说说哪些是线程独享、哪些是线程共享的?
- 详细说一下Java堆的分区,他们的比例,以及如果把比例调大以后会有什么样的后果?
- 说一下JVM的GC算法,以及为什么“标记-整理”法更好一些,他能解决什么样的问题?
- 了解过Java类加载机制么?一共有哪几种类加载器?
- 如果你想查看线上正在运行的服务的GC日志,你需要输入什么指令?
- 了解过HashMap么,说一下HashMap的原理。
- 如果两个对象hashCode相同,则一定是相同对象么,如果是两个相等的对象,那么他们的hashCode相同么?
- 如何解决hash冲突?
- HashMap是线程安全的么,如何把HashMap变成线程安全的类?
- 说一说MySQL数据库有哪些数据库引擎?
- InnoDB的索引的数据结构是什么,说一说他的原理
- 数据库事务等级以及他们解决了什么问题,请举例说明一下
- MySQL默认的事务等级是什么?
- MySQL如何开启慢查询?
- 说一下Spring主要包含哪些模块?
- 说一下你对Spring的IOC容器的理解以及启动流程
- 有了解过RPC框架或分布式的东西么?(这个后来问面试官,就是考察对新技术的了解以及对互联网发展的一个关注度)
- 说一下你读过的有关Java的书籍
面试官标注:一面一共问了26个问题,信息量还是很大的,但是可以看到这些问题都不难,主要是考察基础知识的掌握情况,这一轮面试的难度数据阿里一面的正常难度,持续的时长也算是正常范围。围绕的都是Java基础、MySql数据库以及Spring框架。
第二次技术面(30min)
- 介绍一下你做的项目中你觉得最好的那个;说一下你这个项目中的技术难点和挑战。
- 如何解决商城项目中出现的超卖、少卖问题?
- 说一下什么是幂等性
- Redis如何保证高可用的
- Redis的哨兵模式知道吗?
- 你用Redis觉得有什么缺点吗?
- 你是如何做压力测试的?压力测试的数据是什么?
- 线程池有哪些参数?
- 核心线程数和最大线程数有什么区别?
- 常见的拒绝策略有哪些?
- 介绍一下SpringBoot的特性
- 说一下什么是单例模式
- 什么是饿汉模式、懒汉模式
- 使用懒汉模式的注意事项以及如何解决
- 说一下volatile关键字的作用和原理
- 说一下自旋锁和一些常见的自旋锁的实现
- 说一下数据库的左外连接
- 数据库索引优化
- 数据库索引的数据结构
面试官标注:二面在一面的基础上开始包含一些如何做优化、底层原理、以及相关框架的优缺点等。希望考察面试者是否有钻研精神,是否有自己独立的思考,而不是那种只会用技术而不会思考的人。
第三次技术面(25min)
- 如何解决商城项目中出现的超卖、少卖问题?
- 在开发项目中,遇到了哪些问题?
- Redis与数据库同步时候出现问题是如何解决的
- 说一下Java当中线程有哪些状态
- 线程的阻塞和等待有什么区别
- 介绍一些Java的锁机制
- 你了解过哪些锁的类型
- 为什么wait、notify这个方***在Object这个类下面
- 分布式、RPC框架有了解过吗
- Redis的线程模型是什么(考察NIO)
- Redis实现的消息队列是如何保证消息不丢
- 介绍一下堆排序是如何实现的
- 介绍一下TCP/IP协议是如何保证消息可靠传输的
- TCP/IP协议做了什么优化(拥塞控制和流量控制)
面试官标注:这一轮和上一轮面试的范围差不多,主要目的也是在做一轮筛选。从这一轮和上一轮整体看,重点都考查了并发编程和Redis的相关知识。
第四次技术面(15min)
- 说一下你投稿的文章写的是什么内容
- 介绍一下消息队列
- 超卖是如何解决的?
- 下单过程是如何设计的?
- 介绍一下雪花算法
- 你怎么理解分布式?
- 分布式之间怎么通信?
- 生产者、消费者模型是怎么工作的?
- Java里面创建线程的方式
- 代码场景:给一个字符串,统计每个大写字母出现的次数,按照次数排序,从小到大输出字母和其出现的次数
面试官标注:这一轮开始问到了一些和分布式有关的知识,这部分知识点对于本科生来说确实会有些难度,因为大部分人都没有接触过,所以要求也不会太高,一般会关注一些理论知识或者概念的理解
交叉面试(30min)
- 你在学校学习过程中,哪些可能成绩更好一些以及为什么这些课程成绩更好一些
- 你学习Java多长时间了
- 你是如何学习Java的?
- 你看过哪些开源框架源码?
- 你是怎么看开源框架源码的?
- 介绍一个你参与较多或者比较有难度的项目
- 你们团队开发项目的时候有没有大家一起解决的某些技术问题
- 你们做的这个项目有没有借鉴过其他已经成熟的项目
- 说一下你们项目的要求和指标大概是多少
- 你们项目中的线程池队列容量是如何确定的
- 项目中的某些解决方案是个人想出来的还是团队讨论的结果
- 如果再让你做一个商城系统,你会做哪些技术选型
- 项目中做过哪些安全方面的措施
- 你会如何设计一个淘宝会员系统?
- 你未来的发展方向是什么?
面试官标注:这一轮的问题就都比较开放了,因为能到达这一轮的说明技术都是还可以的,这一轮一般会给出一些问题,询问解决方案等,更好的考察面试者的全方面知识的理解以及如何灵活运用。
面试总结
每一次面试都感觉是煎熬,虽然之前看过很多阿里的面经,都说阿里面试官会抓住某一点一直问下去,直到问到你不会为止,但是当第一次亲身体会的时候,还是感觉很煎熬。
不过最终的结果还是好的,至少收到了心仪的offer,能在这个疫情期间,大环境不好的情况下找到实习工作。
对于整个的学习过程和面试过程,最大的感悟有四:
- 基础知识要扎实,尤其是Java和数据库的基础知识,如果基础知识不扎实,后面什么框架和实战不会有太好的结果
- 多看一些技术类的博客或者文章,但是要有自己的思考,因为很多技术类文章都是跟紧互联网发展的,多看一些能够更加了解互联网的发展方向;同时自己的思考也能让自己过滤掉某些文章中的较差的观点,做到取其精华去其糟粕
- 主动很重要,给我内推的学长是我主动认识的,我的导师是我主动认识的,学技术也是我主动学习的,这世上没有天上掉馅饼的好事,主动才会有故事
- 一个合适的导师真的很重要,我在遇到我的导师之前,学习方向很迷茫,对于很多东西都不知道如何入手,很多文章也没有解决我的问题;老师这时候就可以指明方向,让我的学习之路少了很多崎岖
面试官标注:这4点,总结的很到位,如果很多人能够像本文作者一样,在大学期间就能按照这4点要求去努力的话,相信都可以拿到很好的Offer
以上就是我暑期实习的应聘全过程,当然了,作为技术人员就要保持终生学习的态度,不断提高自己的核心竞争力,才能不被时代所淘汰。
以上,就是作者的一些总结,其实,从他开始准备校招到最后拿到阿里的Offer,我们一直都有些交流,可以看得出来,他拿到满意的Offer除了和自己实力有关之外,自己的努力也起到了很大的作用。
很多人说,现在阿里要求越来越高了,是不是非985/211就完全没有机会了,但是,其实通过本文作者的经历就能知道,机会是自己努力创造的。
最后,送给本文的作者——小胖儿、我自己以及所有读者一句话:
愿你一生努力,一生被爱。想要的都拥有,得不到的都释怀。
天给大家分享一份在GitHub上访问下载破百万的神仙级文档,据说有人凭借这份文档成功拿下阿里offer并定级p7。
这份文档包含了:JavaOoP面试题,Java集合/泛型面试题,Javs异常面试题,Java中的I0与NI0面试题,Java反射面试题,Java序列化面试题,Javs注解面试题,多线程并发面试题,JVM面试题,Mysq1面试题,Redi s面试题,Meme ached面试题,MongoDB面试题,Spring面试题,Spring Boot面试题,Spring Cloud面试题,Rabbi tMQ面试题,Dubbo 面试题,MyBatis 面试题,ZooKeeper 面试题,数据结构面试题,算法面试题,Elasticsearch 面试题,Kafka面试题,微服务面试题,Linux面试题等,几乎是囊括了Java面试的所有技术点接下来带大家先睹为快!
内容简介
JM面试题
- 1、java中会存在内存泄漏吗,请简单描述。
- 2、64位JYM中,int的长度是多数?
- 3、Serial与Parallel GC之间的不同之处?
- 4、32位和64位的JjM, int类型表里的长度是多数?
- 5、Java中WeakReference与SoftReterence的区别?
- 6、JyM选项-XX: +UseCompr essed0ops有什么作用?为什么要使用
- 7、怎样通过Java程序来判断Jym是32位还是64位?
- 8、32位JyM和64位JM的最大堆内存分别是多数?
- 9、JRE、JDK、Jym及Jir之间有什么不同?
- 10、解释Java 堆空间及GC?
- 11、JYmM 内存区域
- 12、程序计数器(线程私有)
- 13、虚拟机栈(线程私有)
- 14、本地方法区(线程私有)
- 15、你能保证GC执行吗?
- 16、怎么获取Java程序使用的内存?堆使用的百分比?
- 17、Java中堆和栈有什么区别?
- 18、描述一下Jm加载class文件的原理机制
- 19、GC是什么?为什么要有GC?
- 20、堆(Heap- 线程共享)运行时数据区
- 21、方法区/永久代(线程共享)
- 22、JyM运行时内存
多线程高并发面试题
JAVA并发知识库
- 1、Java中实现多线程有几种方法
- 2、继承Thread 类3、实现Runnable 接口。
- 4、ExecutorService、 Callable、 Future 有返回值线程
- 5、基于线程池的方式6、4种线程池
- 7、如何停止- -个正在运行的线程
- 8、noti fy()和noti fyAll()有什么区别
- 9、sleep()和wait()有什么区别?
- 10、volatile 是什么?可以保证有序性吗?
- 11、Thread 类中的start()和run()方法有什么区别?
- 12、为什么wait, notify 和noti fykll这些方法不在thread类里面?
- 13、为什么wai t和noti fy方法要在同步块中调用?
- 14、Java中interrupted和isInterruptedd方法的区别?
- 15、Java中synchronized和ReentrantLock有什么不同?
- 16、有三个线程T1, T2, T3,如何保证顺序执行?
- 17、Synchr oni zedMap和C oncurr entHashMap有什么区别?
- 18、什么是线程安全
- 19、Thread类中的yi e1d方法有什么作
- 20、Jav线程池中submit()和execute(方法有什么区别?
- 21、说一说自己对于synchronized 关键字的了解
- 22、说说自己是怎么使用synchronized关键字,在项目中用到了吗synchronired关键字最主要的三种使用方式23、什么是线程安全? Vector是一个线程安全类吗?
Spring面试题
- 1、不同版本的Spring Framework 有哪些主要功能?
- 2、什么是Spring Framework?
- 3、列举Spring Framework的优点。
- 4、Spring Framework有哪些不同的功能?
- 5、Spring Framework中有多少个模块,它们分别是什么?
- 6、什么是Spring配置文件?
- 7、Spring应用程序有哪些不同组件?
- 8、使用Spring 有哪些方式?
- 9、什么是Spring IOC容器?
- 10、什么是依赖注入?
- 11、可以通过多少种方式完成依赖注入
- 12、区分构造函数注入和setter 注入
- 13、spring中有多少种IOC容器?
- 14、区分BeanFactory 和ApplicationContexto
- 15、列举IoC 的一些好处。
- 16、Spring IoC的实现机制。
- 17、什么是spring bean?
- 18、spring 提供了哪些配置方式?
- 19、spring 支持集中bean scope?
- 20、spring bean容器的生命周期是什么样的?
- 21、什么是spring 的内部bean?
- 22、什么是spring 装配23、自动装配有哪些方式?
- 24、自动装配有什么局限?25、什么是基于注解的答器配置
- 26、如何在spring 中启动注解装配?
Dubbo面试题
- 1、为什么要用Dubbo?
- 2、Dubbo的整体架构设计有哪些分层?
- 3、默认使用的是什么通信框架,还有别的选择吗?
- 4、服务调用是阻塞的吗?
- 5、-般使用什么注册中心?还有别的选择吗?
- 6、默认使用什么序列化框架,你知道的还有哪些?
- 7、服务提供者能实现失效提出是什么原理?
- 8、服务上线怎么不影响旧版本?
- 9、如何解决服务调用链过长的问题?
- 10、说说核心的配置有哪些?
- 11、Dubbo推荐用什么协议?
- 12、同一个服务多个注册的情况下可以直连某-一个服务吗?
- 13、画一画服务注册与发现的流程图?
- 14、Dubbo集群容错有几种方案?
- 15、Dubbo服务降级,失败重试怎么做
- 16、Dubbo使用过程中都遇到了些什么问题?
- 17、Dubbo Moni tor实现原理?
- 18、Dubbo用到哪些设计模式?
- 19、Dubbo配置文件是如何加载到Spring中的?
- 20、Dubbo SPI和Java SPI区别?
- 21、Dubbo支持分布式事务吗?
- 22、Dubbo可以对结果进行缓存吗?
- 23、服务上线怎么兼容旧版本?
- 24、Dubbo必须依赖的包有哪些?
- 25、Dubbo telnet 命令能做什么?
- 26、Dubbo支持服务降级吗?
- 27、Tr1bbo 如何代在恒机φ
数据结构面试题
- 1、栈(stack)
- 2、队列( queue)
- 3、链表(Link)4、散列表(Hash Table)
- 5、排序二叉树
- 6、前缀树
- 7、红黑树
- 8、B-TREE
- 9、位图
微服务面试题
- 2、微服务架构有哪些优势?
- 3、微服务有哪些特点?
- 4、设计微服务的最佳实践是什么?
- 5、微服务架构如何运作?
- 6、微服务架构的优缺点是什么?
- 7、单片,SOA 和微服务架构有什么区别?
- 8、在使用微服务架构时,您面临哪些挑战?
- 9、SOA和微服务架构之间的主要区别是什么?
- 10、微服务有什么特点?
- 11、什么是领域驱动设计?
- 12、为什么需要域驱动设计(DDD) ?
- 13、什么是无所不在的语言?
- 14、什么是凝聚力?
- 15、什么是耦合?
- 16、什么是REST / RESTful以及它的用途是什么?
- 17、你对Spring Boot有什么了解?
- 18、什么是Spring引导的执行器?
- 19、什么是Spring Cloud?
- 20、Spring Cloud解决了哪些问题?
- 21、在Spring MYC应用程序中使用WebMIvcTest 注释有什么用处?
- 22、你能否给出关于休息和微服务的要点?
- 23、什么是不同类型的微服务测试?
- 24、您对Distributed Tr ansacti on有何了解?
Lnux面试题
- 1、绝对路径用什么符号表示?当前目录、上层目录用什么表示?主目录用什么表示?切换目录用什么命令?
- 2、怎么查看当前进程?怎么执行退出?怎么查看当前路径?
- 3、怎么清屏?怎么退出当前命令?怎么执行睡眠?怎么查看当
- 4、Ls命令执行什么功能?可以带哪些参数,有什么区别?
- 5、查看文件有哪些命令
- 6、列举几个常用的Linux命令
- 7、你平时是怎么查看日志的?
- 8、建立软链接(快捷方式),以及硬链接的命令
- 9、目录创建用什么命令?创建文件用什么命令?复制文件用什么命令?
- 10、查看文件内容有哪些命令可以使用
- 11、随意写文件命令?怎么向屏幕输出带空格的字符串,比如”hello world”?
- 12、终端是哪个文件夹下的哪个文件?黑洞文件是哪个文件夹下的哪个命令?
- 13、移动文件用哪个命令?改名用哪个命令?
- 14、复制文件用哪个命令?如果需要连同文件夹一-块复制呢?如果需要有提示功能呢?
- 15、删除文件用哪个命令?如果需要连目录及目录下文件-块删除呢?删除空文件夹用什么命令?
- 16、Linus下命令有哪几种可使用的通配符?分别代表什么含义?
- 17、用什么命令对一个文件的内容进行统计? (行号、单词数、字节数)
- 18、Grep命令有什么用?如何忽略大小写?如何查找不含该串的行?
本书章节过多就不给大家全部展示了,只给大家展示了部分内容,需要获取这本《java面试神技》的小伙伴可以转发+关注后(学习)即可免费获取!