澳洲留学生面经,Java后端,阿里、头条、百度、华为、微策略
本人情况:澳洲Top2本,科班出身,Java后端开发,无大厂实习经历,今年年底毕业。
在刚结束的秋招中有幸参加了几家国内大厂的面试,一路被虐过来的同时也能见到自己的成长。在准备秋招的时候从牛客前辈们的帖子里收获良多,故发一篇面经回馈社区,也给自己做一个总结。
技术面试都在45分钟到2小时不等,有的面试时间有点久远,所以可能会记漏问题或者记串公司。问题后的括号里是我的理解,有不对的地方欢迎指正。
笔试部分就不总结了 无非是选择题,场景题加在线编程题,在牛客刷过题的朋友应该都没问题。
阿里-Java研发工程师:
提前批一面(蚂蚁金服,电话面):
先过了一遍简历上的项目,根据项目提了一些问题
- Servlet和Jsp的本质?它们有什么区别(后者是前者的高一级封装,都编译成独立的.class字节码)
- Servlet创建的过程
- Servlet中的变量是否需要加锁(单实例多线程)
- 用户数据有没有加密,用了什么加密方法
- 服务器是否是分布式
- 数据库是否是分布式,总共有几张表
接着是基础:
- 讲讲HashMap的底层实现原理,get的过程发生了什么(hashCode和equals方法)
- 讲讲对数据库事务的理解(ACID,隔离级别)
- 讲讲悲观锁和乐观锁
最后是共享屏幕编程:
- 输入一个长字符串,打印出其中出现的每个词及其出现次数。(我说用字典树,面试官说只能用Java自带类库。最后用正则表达式加HashMap写出)
- 分析一下算法复杂度
- 能来实习吗
提问环节
二面(电话面):
- 大学期间有哪些印象深刻的计算机课程?(函数式编程,面向对象,算法与数据结构,关系型数据库,分布式与并发,计算机组成与程序运行原理,操作系统,编译原理)
然后面试官提出相关的问题:
- 什么是函数式编程,和Java的面向对象思想有什么区别
- 讲讲你对Haskell这门语言的理解(函数的柯里化,无副作用,惰性求值)
- 为什么Haskell很少用于工业开发(无副作用的按值传递带来效率问题,开发者社区的商业资金注入不足,学习成本较高)
- 按值传递和按引用传递的区别?
- 方法A调用方法B的过程中方法栈上发生了什么(栈帧的创建与销毁)
- 栈帧中包含哪些内容?
- 讲讲HashTable和HashMap的区别(hash定位方式,线程安全性)
- 你会怎么实现乐观锁和悲观锁
- 讲讲对Volatile的理解(禁止指令重排,通过无效化缓存行保证多线程可见性)
- 对缓存行了解多少,伪共享知道吗(MESI缓存一致性协议,JDK8的Contended注解)
- 平时Linux用得多不,常用的命令?
- Linux系统运行缓慢的时候你会怎么做
- 操作系统Mount一个设备的时候是在做什么(给当前文件系统提供一个访问设备数据的入口)
- 命令行里按Ctrl-C发生了什么(父进程向子进程发送终止信号)
- 信号和中断的区别(前者可以在用户空间内定义子流程,且为有时延的异步执行过程,后者需要根据系统中断向量表查找相应子流程或由设备驱动提供子流程,且涉及内核态和用户态的切换)
- 什么是文件系统
- 文件系统是怎么组织的
- 你有什么问题想问我的吗
专场初面(阿里妈妈,视频面):
- 先做个自我介绍吧
- 详细讲讲简历上的每个项目,用到什么技术,从中获得什么收获
- 给一长串数字,其中每个数字的出现次数相当,且其中大部分为1到3000的小数字,少部分为上界不确定的大数字,针对这串数字设计一个2进制无损压缩算法。(阐述思路的时候提到了哈夫曼编码)
- 讲讲哈夫曼编码的思想和建树过程?
- 哈夫曼编码方式在这个场景中是否适用,为什么(不适用,元素数量多且各元素频数差距小的情况下哈夫曼效率低下)
- Java的Object类中有哪些方法,各自的用途
- 讲讲对面向对象的三大特性的理解
- Java中有哪些访问控制符,各自的范围(public > protected > default > private)
- 讲讲熟悉的垃圾回收器(G1)
- 讲讲Spring的AOP和IOC
- 对http协议的理解(基于TCP协议,C/S模型,对URI的操作)
- 讲讲TCP的三次握手过程,为什么一定要三次
- 知道哪些http请求方式,用过哪些(GET, POST, PUT, UPDATE, DELETE)
- GET和POST的区别(消息体,用途,URL,书签,传输格式,长度限制)
- 讲讲http长连接(http1.0的connection: keep-alive, http1.1的默认方式,通过心跳包保活)
- http和https的区别(后者要先通过SSL层的非对称握手过程获得协定的对称密钥,用于后续会话的加/解密)
- MySQL数据库引擎有了解吗
- 讲讲数据库的4个隔离级别(读取未提交,读取已提交,可重复读,串行化)
- 数据库索引用了什么数据结构(B加树)
- B加树的实现原理,和B树的区别
- 组合索引了解吗
- 使用组合索引时有什么需要注意的(最左匹配)
-
给出下列常用的SQL语句,如何建立索引?如果我现在在这个字段上建立了索引,那执行这个SQL语句时会不会用到这个索引?(需要注意最左匹配,模糊查询,or查询,中间提到了SQL语句执行前的预优化阶段)
-
手撕代码:N个数中取最大的10个数,N > 10000。(维护一个元素数为10的小根堆,把所有数据过一遍)
-
分析一下这个算法的复杂度(O(n) 时间, O(1) 空间)
-
加个微信?
-
你有什么想问的吗
终面(电话面)
聊天,个人经历相关:
- 简单地介绍一下自己
- 有女朋友吗
- 留学几年的收获
- 课余时间喜欢做些什么
- 在学校做过什么学生工作
- 在学校成绩怎么样
- 对自己的职业规划是怎样的
技术问题:
- 讲讲网络分层,每一层都有哪些协议(TCP/IP五层模型)
- 浏览器从输入URL到页面显示的过程中发生了什么,越详细越好(解析URL,解析DNS(缓存未命中的情况下需要从根域名开始递归查询),建立TCP连接,http请求与答复,Render树的建立,页面的渲染)
- 讲讲http报文的格式?请求和答复有什么不同
- 自己抓包看过没(Wireshark)
- 现在有1T的文本数据,每行表示一个关键词,求出现次数最高的10个关键词,限定单机只有4G内存。(先假定内存足够,则用HashMap加小根堆可解, 再解决内存的问题:先用hash方法把1T的文本文件散列成多个足以读入内存的小文本文件,分别对每个文件做统计,最后对每个文件的统计结果做***计)
- 你觉得你的方案有什么不足吗(数据分布可能不均匀,可对文本数据采用多次hash,直至单个数据样本足够小)
- 现在有一个包含上亿条目的表,现实中会有大量的用户在这个表上做基于uuid的查询操作,如何改良这个系统的可用性(对这张表的uuid用哈希法做水平切分并建立索引,然后在用户查询时用同样的哈希算法导向到相应的表)
- 你说的是数据库层面的优化,对别的层面有什么想法吗,比如用户查询存在高峰期,如何在节约服务器资源的前提下保证对高并发的容忍度。(在服务器端建立令牌池,每隔固定时间向其中发放令牌,令牌总数有限。每个查询在执行前必须先获取令牌。令牌总数即为某个时刻下服务器可承载的最大并发数,令牌发放间隔即为最大用户增速)
接着聊天,国内互联网行业发展相关
总结:面试体验好,面试官亲切,问问题时会做一些引导和提示,也会告诉你哪些方面存在不足,总体比较注重基础知识,尤其是对Java语言本身的理解。手写代码的题比较简单,应该是想考察编码规范程度。面试官水平高,什么都能聊。但电话面试不会预约,你也不知道什么时候会突然来电话(一面和二面的时候我就在睡觉,时差党)。一面时有个小插曲,面试官不是很熟悉共享屏幕编程用的ide,不知道怎么运行我的代码,场面一度尴尬,直到我无意间调出命令行,才编译运行了代码。专场技术初面面试官是个清秀的小姐姐。
字节跳动-服务器端开发工程师:
内推一面(西瓜视频,视频面):
- 自我介绍
- 介绍一下项目用到的技术
- 对http有哪些了解(0.9到2.0各版本区别,C/S模型,TCP)
- https是怎么做到会话加密的(SSL握手确立会话密钥)
- 讲讲你知道的非对称加密算法(基于离散对数难题的DH算法和基于质因数分解难题的RSA算法)
- Cookies和Session有什么区别
- 如果用户禁用了Cookies,如何获取用户的状态
- 讲讲http状态码(2正常,3重定向,4客户端错误,5服务器端错误)
- 301和302分别是什么情况
- TCP和UDP的区别
- TCP是怎么做拥塞控制的(滑动窗口,慢启动算法)
- 详细讲讲TCP三次握手和四次挥手的过程,中间涉及哪些状态位的变化
- 为什么分别要三次和四次
- 四次挥手时为什么需要等待2倍最长报文发送时间
- 迅雷为什么用UDP传输文件(P2P环境中的NAT穿孔问题)
- 进程和线程的区别
- 创立和销毁进程的开销具体指什么
- 对比多进程和多线程的优劣
- 进程间有哪些通信方式,分别的使用场合
- 解释一下僵尸进程和孤儿进程
- 讲讲Linux的内存管理方式
- 讲讲你知道的进程调度算法
- 你会怎么实现JVM(这个问题直接把我卡死了)
- 那你介绍一下现有的JVM内存模型(先讲5大区域,再补充说明JDK7方法区和永久代的分离,JDK8的元空间)
- 讲讲你了解的垃圾回收算法(G1,CMS)
- 回收过程中的哪个阶段需要stop the world
- 为什么CMS回收器不常用
- 你觉得现有的垃圾回收器有哪些地方需要优化,让你来优化你会怎么做(G1需要较多额外空间开销(Remember Set, Collection Set),回收进行中也对剩余空间有要求,CMS的重新标记阶段停顿时间较长且时间不可控)
- 讲讲Java类加载器的双亲委派机制
手撕算法:
- 输入一个二维数组,从(0,0)开始顺时针由外向内旋转打印出每个元素。
- 分析你的算法复杂度。
二面(视频面):
- 自我介绍
- 在学校学了哪些计算机课程
- 关系型数据库和并发分布式,你挑一个熟悉的,我来问(挑了并发分布式)
- Paxos协议和Raft协议了解吗(Raft的半数***,定时心跳保活/重***,基于日志保证一致性,小于半数的分区容错性)
- P2P环境下的分布式缓存问题(一致性Hash)
- 有没有JVM调优的经验,看过dump没(gg)
- 讲讲对Redis的了解,有哪些基本类型和各自底层实现方法
- 什么是死锁(四个必要条件)
- 死锁的预防和避免方法(银行家算法,打破必要条件)
因为简历上提到自学过FPGA,也被问了几个问题:
- FPGA编程用到了什么语言(verilog)
- FPGA和普通单片机有什么区别(前者通过对数字电路逻辑单元的组合实现基于硬件的并行运算,无需共享内存,但烧写程序的时间很长,后者基于传统的冯诺伊曼架构)
- 软中断和硬中断的区别
手撕算法:
- 输入两个有序数组,求两个数组中所有数字的中位数,要求时间复杂度为O(log(m加n)),m和n为两个数组的长度。
总结:一面可能是碰到了压力面试或面试官心情不好,会打断人说话,且眼睛盯着另一块屏幕。二面面试官态度有好转。面试总体更注重操作系统和计算机网络基础知识,以及算法和工业实战经验。面试采用牛客面试平台,个人体验不佳,画面和声音延迟问题较严重,两轮面试总共掉线4次,对心态有较大影响。
华为-IT应用软件开发工程师:
技术面(视频面):
- 自我介绍
详细地过了一遍简历上的项目
- 谈谈项目过程中的个人收获
- 项目过程中碰到哪些难题,怎么解决的
- 讲讲对面向对象思想的理解(封装、继承和多态)
- 讲讲对REST的理解
(别的问题不记得了)
- 你为什么喜欢Java(用Python和C***分别做了比较。介绍了JVM的实现,垃圾回收算法的发展,自带类库的实现blabla。这个问题和面试官聊了蛮久)。
- (面试官看表)你是今天最后一个面试者,不如把这次面试当作一个开放的对话,讲讲你的职业规划吧(…说好的技术面呢)
- 希望以后有机会交流技术
- 有什么想问我的吗
综合面(视频面):
- 自我介绍
又过了一遍简历上的项目,并挑了其中规模最大的项目
- 这个项目有多少人
- 项目中你贡献了多少代码
- 平时怎么跟客户沟通(定期Slack在线会议和线下会议)
- 项目是用敏捷开发吗
- 项目初期应该做哪些准备(User Story和 Use Case的确立,各个sprint的阶段目标,确立最小可用产品,以及任务优先级决策)
- 在校成绩如何
- 平时是怎么学习的(CSDN,StackOverFlow,Youtube,微信学习小组)
- 你的朋友们是怎么看你的
- 当初为什么选择出国
- 你对华为的企业文化有什么了解和看法
- 期待的工作地点和薪资
- 你有什么想问我的吗
总结:见识到了华为传说中的玄学聊天面试,总体体验良好,气氛比较轻松,更注重考察面试者某方面的专精程度和对项目管理的理解,以及可培养性。是唯一一家除了笔试的编程题外不用现场手撕代码的(不过我有朋友被要求现场手写代码,应该是看面试官)。面试过程采用Zoom视频会议软件,海外用户体验好。整个招聘流程安排得井井有条,从最早的电话联系到每次面试专用的微信群建立,可以说是感动留学生。
百度-Java研发工程师:
一面(视频面):
- 自我介绍
- 项目介绍,用到的技术和碰到的难点
- Java的Object类中有哪些方法,各自的作用
- 深拷贝和浅拷贝的区别,怎么实现深拷贝
- HashMap是线程安全的吗(多线程扩容的链表死环)
- 讲讲HashTable和HashMap的区别
- 为什么HashTable不允许null键值(HashTable起初是为并发环境设计。如果get一个null键返回的结果是null,那么有两种可能: 1.hashtable中存放了一个(null, null)键值对。 2.hashtable中不存在null这个key。 这就要求使用者用containsKey()方法来做进一步确认。但是在这两个操作中间很可能发生并发修改导致结果出错。所以一开始就禁止了null键或null值。相同的理念也可以在其他的并发map中见到。)
- ConcurrentHashMap是怎么确保线程安全的(JDK7的分段加锁,JDK8的行锁)
- 什么时候会出现Fail-Fast机制(遍历并发集合时ModCount发生变化)
- ArrayList是线程安全的吗(对下标的竞争,扩容的竞争)
- 多线程下用什么动态数组(读多写少CopyOnWriteArrayList,Vector)
- 讲讲Synchronized和ReentrantLock的区别(顺便提了对象监视器, JDK5之后引入的偏向锁->轻量级锁->重量级锁以及他们在对象头中的表示,还有CAS和AQS)
- 讲讲对CAS和AQS的理解(AQS基于CAS,基于AQS可以实现用途不同的同步器,基于不同的同步器可以实现用途不同的同步类,如Semaphore, CountdownLatch, ReentrantLock,基于不同的同步类可以实现不同的并发类)
- CAS的ABA问题
- 线程池的各个参数作用
- 线程池的丢弃策略
- LinkedBlockingQueue和ArrayBlockingQueue的区别(前者基于***链表且take和put分别加锁,后者基于有界数组,take和put用同一个锁)
- 讲讲MySQL数据库引擎
- 讲讲事务的四个隔离级别
- 事务隔离级别是怎么实现的(基于共享锁与排他锁。读取未提交:读不加锁,写加行级排他锁直至事务结束。读取已提交:读加行级共享锁直到读取结束,写加行级排他锁直到事务结束。可重复读:读加行级共享锁直到事务结束,写加行级排他锁直到事务结束。串行化:读加表级共享锁直到事务结束,写加表级排他锁直到事务结束)
- Linux常用命令
- Linux是怎么实现用户权限的?权限755有什么含义
- 口述算法:给定一棵二叉树的前序遍历序列和中序遍历序列,求后序遍历序列
- 手撕代码:求两个字符串的最长公共子串(动态规划)
- 除了后端方向之外你平时还对什么方向感兴趣(自学过斯坦福机器学习公开课)
- 有什么想问的吗
二面(视频面):
- 自我介绍
- 假设有一个商城应用,如何保证并发的多个相同退款请求只被处理一次(全局唯一请求ID)
- 怎么实现邮件黑名单功能(布隆过滤器 白名单机制)
- 怎么实现单点登录(子服务的登录请求全部路由至主服务,初次登录时在主服务端保存全局会话令牌,后续子服务的局部会话需请求和验证该令牌,退出登录时将该令牌无效化)
手撕代码:
- 用Object类的wait和nofity方法实现一个生产者消费者模型
- 已知平面中两个喷泉的坐标和N个花坛的坐标,求两个喷泉的半径r1和r2,使得喷泉能浇灌到所有花坛,且r1^2加r2^2的值最小。(维护两个大小为N的大根堆A和B,堆A的排序标准为花坛到喷泉1的距离,堆B的排序标准为花坛到喷泉2的距离。先把所有花坛加入堆A,再依次从堆A中将堆顶元素出堆并加入堆B,同时记录下堆A堆顶元素与堆B堆顶元素的平方和S。当堆A为空时,输出整个过程中S取到的最小值,即为答案,时间复杂度O(nlogn),空间复杂度O(n))
总结:面试体验良好。一面面试官似乎是第一次参加面试,迟到了一小会,然后花了好几分钟才调出我的简历。整体注重基础和对工业场景的了解(和阿里面试有点像)。二面写算法题时因为牛客面试平台网络不稳定而被迫下线,后来因为无法联系到百度招聘方而中止了面试流程。官网状态仍是"面试流程中"。
微策略-Associate Software Engineer
技术面(视频面):
- 英文的自我介绍和项目介绍
面试官:看来你英文没问题,我们后面就用中文面试吧
- 讲讲你对面向对象的理解吧
- Java中封装,继承和多态是怎么体现的
- Final关键字的作用
- Final, finally, finalize的区别
- 重写和重载的区别
- Java中Synchronized关键字的作用
- 知道软件开发的SOLID原则吗
- 讲讲你对REST的理解,和RPC有什么不同
- 熟悉Java中的哪些Map
- HashMap和TreeMap各个操作的时间复杂度对比(前者基于链表 红黑树数组,后者基于红黑树)
- 讲讲你熟悉的设计模式(单例模式,装饰模式,工厂模式,观察者模式,***模式,策略模式)
- 讲讲装饰模式的思想和实现(举了Java中IO处理类的例子)
- 讲讲工厂模式的思想和实现(举了Java中线程池工厂的例子)
- 讲讲观察者模式的思想和实现(举了一个通过观察者接口实现UI界面统一更新的例子)
- 讲讲***模式的思想和实现(基于接口实现的JDK动态***和基于类继承的cglib动态***,以及基于字节码文件的静态***)
- 讲讲策略模式的思想和实现(举了JDBC的例子)
- 讲讲你了解的单例模式写法,知道的都说一下(饿汉式和懒汉式)
- 这两种方式是怎么保证对象唯一性的
- 懒汉式为什么需要两个if语句(分别确保效率和安全性)
- Volatile的作用
- 为什么要防止指令重排(顺便提了下JVMM的happens-before原则)
(别的问题不记得了,后来还问了一道C***的题,但我不懂C***,尴尬了)
也根据简历上的语言能力问了几个问题:
- 你是广东人吧?
- 普通话有专门练过么
- 日语在哪学的,水平怎样
口述算法:
- 怎么反转一棵二叉树,这里的反转指的是每个节点的左右子树交换(递归至叶子节点)
- 怎么一层一层地遍历二叉树(BFS)
手撕代码:
- 给定一个括号序列,判断这个序列是否合法。合法的定义为:每一个左括号都能在其右侧找到一个匹配的右括号,每一个右括号都能在其左侧找到一个匹配的左括号。
- 给定一个括号序列,求最少删除几个元素后能使这个序列变为合法序列
-
输入一个数字N,输出所有长度为N的合法括号序列
-
希望有机会合作
-
你有什么问题想问的吗(问后面还有几轮技术面,面试官让我直接准备主管面)
主管面(视频面,全英文):
- 自我介绍和项目介绍
详细地过了一遍项目
- 平时怎么学习的
- 在校成绩如何
- 课余时间喜欢做些什么(提到了隔壁工程学院的一些项目)
- 聊了些简历上没写的校园项目
- 你有什么问题想问的吗
总结:面试体验非常好,一面小哥很亲切,说话喜欢用“哒“结尾,并且每道算法题写完后会引导面试者优化算法至最优解。因为是外企,比较注重外语能力,一面部分英文,二面全英文。并且外企不根据语言和方向招人,而是统招Software Engineer,面试时也是考察设计模式和算法这类综合能力为主。笔试时除了计算机基础测试外还有英语测试和智力测试。面试结果下来地很快,一面当场告知通过,二面结束后3分钟告知通过,3个工作日后收到offer。
#面经##百度##华为##阿里巴巴##Java工程师#