四面阿里,三面百度,成功斩获阿里offer!分享下经验总结和面试问题(Java岗)
面试过程
最近去阿里的菜鸟国际做了一次面试交流,发现大公司对于面试者的知识结构考核非常严谨,可以作为我们日常工作学习的指导。虽然很多人说面试问到的东西在实际工作中很少用到,甚至有「面试造火箭,工作拧螺丝」的说法。
但从面试中,其实可以看得出来现在的公司对于面试者的知识体系要求。如果我们能在工作中就按着这样的要求去不断提升,那么在面试的时候必然也能游刃有余。
一般来说,阿里的面试会有两轮的技术电面,分别交叉检验你的技术基础。后面还有两轮的现场技术面试,主要检验你的项目经验。但从知识体系的角度来看,阿里面试对于知识的考核可以分为三个层次:对于基础知识的考核、对于项目经验的考核、对于项目深度的考核。
一、基础知识考核
在这个层次上,主要考核你对 Java 语言本身原理的理解以及各种框架的原理理解。对于 Java 开发岗位上来说,这些知识点包括但不限于:
- 集合 HashMap 的原理,与 Hashtable、ConcurrentHashMap 的区别?
- Java 线程池的核心属性以及处理流程
- Java 并发包原理、Synchronized关键字、锁
- 线程的生命周期
- JVM类加载机制
- JVM内存模型
- JVM分代以及垃圾回收机制
- Spring Bean 容器生命周期
- Spring AOP 原理
- Dubbo 请求流程以及原理
- 数据库 SQL 优化、数据库索引、索引原理
- ……
看到这么多的知识点,我一下子就懵逼了,这么多得看到什么时候才看得完啊?但后面我想明白了,其实你不需要全部都懂,但需要了解大部分知识点,并且在这大部分知识点中,还需要有部分是了解得非常深入的。如果达到这个水平,基本上都能通过考核。
对于基础知识的考核多出现在阿里的前两轮电话面试上。对于这块,你事前把常见的面试题目看一遍,多面试几次基本上都没有问题。
二、项目经验的考核
当你成功通过基础知识的考核之后,你会进入下一关的考验:项目的理解程度。
面试官首先会让你选择一个你最拿手的项目,画出架构图,之后的一切问题都从这个架构图触发。当你画出架构图之后,你肯定需要解释清楚每个模块的作用,每个框架的原理以及与其他框架的区别。
例如我就用我做过的一个搜索项目作为经典项目,与面试官探讨。
项目中用到了 Kafka 这个框架,那么面试官就会问 Kafka 和 RocketMQ 之间的区别是什么,它们两个有什么不同?
项目中还用到了 Canal 这个阿里巴巴开源的框架,那么面试官自然会问这个东西是干嘛的,原理是怎样的?
项目中还用到了 Zookeeper 作为协调者,那么 Zookeeper 在这个项目中的作用是什么,扮演了什么角色?
对于「项目理解程度」的考核会发生在技术面试的三四轮。在这个层次上,你必须要有一个拿得出手的项目,并且对其中的所有框架以及原理都了如指掌,否则你会被虐惨。
三、项目深度的考核
通过上一轮对于「项目理解程度」的考核后,基本上你对整个项目都会有一个全面的认识,应用层面上的问题基本上不会难倒你了。但在「项目思考深度」的考核上,就不仅仅只是考核应用层面上的问题了。
还是用我做过的一个搜索项目作为例子,其中 Canal 这个开源框架暂时是没有实现集群这个功能的,那么面试官就问了:
你如何去改造这个项目,从而实现 Canal 的集群功能?
这个时候,你会发现你懵逼了,因为你从来没有去思考过这个问题。你所有的工作内容都是在想如何使用开源框架,而没有进一步思考这些开源框架好不好,有什么可以改进的地方。
所以,在这一个层次上考核的是你对开源框架的思考深度,这些框架到底好不好,好在哪里,不好在哪里,有什么可以改进的地方。
对于「项目思考深度」的考核同样发生在技术面试的三四轮。在这个层次上,你不仅要对项目本身理解足够深刻,还要跳出项目本身,去思考开源框架本身的问题。
四、总结
当我们回过头来总结,你会发现这三个层次都是层层递进的,而且逐步深入。虽然这是面试中总结出来的经验,但是这却是一个很好的学习指引。读者可以自己自查,看看自己现在是处于哪个层次,这样在工作中也可以不断地向更高层次迈进。
对于我来说,我缺乏的是对于项目的思考深度,很多时候都是业界觉得好,那我就用了。但是作为一个高级开发,甚至是一个即将成为架构师的高级开发来说,你必须知道为什么要用这些框架?它有什么问题,我们能不能做得更好?只有这样,我们才能有所成长。
阿里面试真题:
一面(主要是jvm,并发,锁,数据结构等基础)
- 自我介绍(说说自己的擅长及拿手的技术)
- 说说treemap和HashMap的区别?HashMap和ConcurrentHashMap的区别?
- HashMap底层如何实现(JDK1.8有所改动)?
- 说说Hash的一致算法?
- 你知道的GC算法和回收策略有哪些?GC的机制是什么?
- 垃圾回收器的基本原理?是否可以立即回收内存?怎么样主动的通知JVM进行垃圾回收?
- 双亲委派模型机制线程池创建的几个核心构造参数是什么?
- 乐观锁和悲观锁?可重入锁和Synchronized?他们都是可重入锁吗?哪个效率更高?
- CountDownLaunch和Cylicbarrior的区别以及分别是在哪样场景下使用的?
- Http和Https的区别以及Https加密的方式?
- 以后的职业规划和想法
二面(主要是数据库,协议 , Spring等 )
- 自我介绍,聊下自己认为做得很好的项目!
- InnoDB支持的四种事务隔离级别名称是什么?之间的区别是什么? MySQL隔离级别是什么?
- 说说事务的特性?讲讲对慢查询的分析?
- 你理解的BTree机制?
- 有哪些MySQL常用的优化方法?6. Http请求过程, DNS解析的过程?7.三次握手和四次握手的过程?
- B+树索引和Hash索引之间的区别?
- Spring IOC如何管理Bean之间的依赖关系,怎么样避免循环依赖?
- SpringBean创建过程中的设计模式?11.说说AOP的实现原理?
- Tomcat的基本架构是什么?
三面(主要是缓存,并发,分布式)
- 自己项目中的总结的并发经验
- 说说MySQL的锁并发?加锁的机制是什么?
- 高并发场景下如何防止死锁,保证数据的一致性?
- 集群和负载均衡的算法与实现?
- 说说分库与分表设计?
- 分库分表带来的分布式困境与对应之策有哪些?
- Redis和Setnx命令使如何实现分布式锁的?
- 使用Redis怎么进行异步队列?会有什么缺点?
- 缓存击穿的概念和解决方案?
- Redis的数据结构?线程模型? Redis的数据淘汰机制?
- Redis的数据一致性问题12. MQ底层原理的实现?
- 阻塞队列不用Java提供的该怎么实现?
- 讲讲负载均衡的原理?
- 如何实现高并发环境下的削峰、限流?
百度面试真题:
百度一面
- 手写ArrayList
- 手写进制转换算法,求出一个数的二进制数1的个数
- JAVA基础 equals和==
- 多线程方式、threadlocal,各种锁,synchronized和lock
- 设计模式、spring类加载方式、实例保存在哪、aop ioc、反射机制
- 类加载器,双亲委派模型,热部署
- jvm内存模型,内存结构、堆的分代算法、堆的分区、gc算法、gc过程。
- tcp ip 七层模型 rest接口规范 get和post区别,长度,安全。
- tcp ip的arp协议,两个同一网络的主机如何获得对方的mac地址。
- 负载均衡、高并发、高可用的架构
- mysql的引擎区别
- redis缓存,redis的集群部署,热备份,主从备份,主从数据库,hash映射找到知道指定节点。
- 了解云计算么,了解云容器docker么,容器和虚拟机的区别
百度二面
- 自我介绍 项目中负责哪些 做了哪些
- 项目中的数据库备份,主从数据库、集群
- 数据库的索引原理,b+树原理,trie树引申,二叉查找树的原理
- 海量数据中查找一个单词,分布式计算map reduce ,或者用hsah映射筛选部分结果
- java的抽象类和接口区别、java的hashmap,java的内存模型,分区,分代垃圾回收算法。实例、常量放在哪里。
- int 4个字节,double 8个字节。
- 多线程中的wait和sleep区别,notify的作用
- 设计模式了解哪些,写一个观察者模式。实现两个接口,一个是主题一个是观察者,并写出对应方法。
- 写一个生产者消费者队列的方法,分别写两个类代表生产者和消费者,并且用队列模拟其生产消费。用while循环和waitnotify可以实现,但我忘记在队列上加synchronize关键字,于是让我再写一题。写的是:输入一个字符串,输入第一个只出现一次的字符,写出来了。
- tcp ip的四次挥手 子网掩码的作用, 子网掩码(subnet mask)又叫 网络掩码 、 地址掩码 、子网络遮罩,它是一种用来指明一个IP地址 的哪些位标识的是 主机所在的子网,以及哪些位标识的是主机的位掩码。子网掩码不能单独存在,它必须结合IP地址一起使用。子网掩码只有一个作用,就是将某个IP地址划分成 网络地址 和主机地址 两部分。
- 了解linux么,说一下linux的内核锁?没接触过。
- 有没有用过sed 使用shell脚本写一个将文本中的字符替换掉的脚本,大概说了一下用grep || 替换。没再问linux的
百度三面
- 自我介绍
- 负责模块,哪些模块,项目一的架构,我说太久了忘了,说最近的项目。
- 数据库连接池用的是什么,配置文件呢,数据库驱动怎么下载的,持久层框架呢。
- 为什么要用数据库连接池,有什么好处。
- java的内存模型,变量和实例存在哪。java栈的作用,java的堆存什么,方法区存什么。
- java的分代回收。
- 项目如何部署到云主机上,有什么速度提升,为什么有提升,答主要是设备性能和带宽。
- tomcat的配置,堆得初始大小是多少,达不知道。
- 问遇到过什么难题。
- 问在遇到问题时候的办法。
- 抗压能力
- 优缺点
- 接受加班。
- 遇到工作问题,同事不配合怎么办。
- 快速上手工作的办法。
- 平时学习的方法,举几点。
- 职业规划
最后
感谢各位程序员同仁阅读。感谢支持,我会更加努力分享,喜欢的朋友可以关注下,祝大家面试通过拿到心仪offer。
面试题答案解析,直接点击 这里,对,就是这里,回复暗号;CS 即可免费领取。含有各种面试题以及答案解析,Java进阶架构知识点资源。包含但不限于(分布式架构、高并发、Jvm性能调优、Spring,MyBatis,Nginx源码分析,Redis,ActiveMQ、、Mycat、Netty、Kafka、Mysql、Zookeeper、Tomcat、Docker、Dubbo、Nginx等知识点解析)也有各大互联网公司人才,可以交流讨论共同进步。
更多笔记分享
最全最新面试文档分享,先一步了解大型互联网面试题及答案,对面试文档总结感兴趣可以直接点击 这里,对,就是这里,回复暗号;CS 即可免费领取(整理不易)大型互联网企业面试答案获取详情!