⽂章有点⻓,请耐⼼看完,绝对有收获!不想听我BB直接进⼊⾯试分享:

  • 准备过程

  • 拼多多⾯试分享

  • 蚂蚁⾦服⾯试分享

  • 字节跳动⾯试分享

  • 总结

  • 资料分享

准备过程

我2016先在蚂蚁实习了将近三个⽉,然后去了我现在的⽼东家,2.5年⼯作经验,可以说毕业后就⼀直⽼⽼实实在⽼东家打怪升级,虽说有蚂蚁的实习经历,但是因为时间太短,还是有点虚的。

准备过程其实很早开始了,而且⼯作之余常常会去额外研究⾃⼰感兴趣的技术以及⼯作⽤到的技术,⼒求把原理搞明⽩,并且会⾃⼰实践⼀把。什么操作系统、数据结构与算法、MySQL、JDK之类的源码,基本都好好温习了,我深知基础就像“⽊桶效应”的短板,决定了能装多少⽔。

剩下的准备就是找平台和内推了,除了蚂蚁,头条和拼多多都是找⼈内推的,感谢蚂蚁⾯试官对我的欣赏,以后说不定会去蚂蚁咯

平台:脉脉、GitHub、v2

拼多多面试

一⾯

  • Java中的HashMap、TreeMap解释下?(TreeMap红⿊树,有序,HashMap⽆序,数组+链表)

  • TreeMap查询写⼊的时间复杂度多少?

  • HashMap多线程有什么问题?

  • CAS和synchronize有什么区别?

  • 如果要保证线程安全怎么办?(ConcurrentHashMap)

  • ConcurrentHashMap怎么实现线程安全的?(分段锁)

  • get需要加锁么,为什么?(不⽤,volatile关键字)

  • volatile的作⽤是什么?(保证内存可⻅性)

  • 底层怎么实现的?(说了主内存和⼯作内存,读写内存屏障,happen-before,并在纸上画了线程交互图)

  • 在多核CPU下,可⻅性怎么保证?(思考了⼀会,总线嗅探技术)

  • 聊项⽬,系统之间是怎么交互的?

  • 系统并发多少,怎么优化?

  • 给我⼀张纸,画了⼀个九⽅格,都填了数字,给⼀个MN矩阵,从1开始逆时针打印这MN个数,要求时间复杂度尽可能低(内⼼OS:之前貌似碰到过这题,最优解是怎么实现来着)思考中。。。

  • 可以先说下你的思路(想起来了,说了什么时候要变换⽅向的条件,向右、向下、向左、向上,依此循环)

  • 有什么想问我的?

二面

  • ⾃我介绍下

  • ⼿上还有其他offer么?(拿了蚂蚁的offer)

  • 部⻔组织结构是怎样的?(这轮不是技术⾯么,不过还是⽼⽼实实说了)

  • 系统有哪些模块,每个模块⽤了哪些技术,数据怎么流转的?

  • 链路追踪的信息是怎么传递的?

  • SpanId怎么保证唯⼀性?(UUID,说了下内部的定制改动)

  • RpcContext是在什么维度传递的?(线程)

  • Dubbo的远程调⽤怎么实现的?(讲了读取配置、拼装url、创建Invoker、服务导出、服务注册以及消费者通过动态代理、filter、获取Invoker列表、负载均衡等过程

  • Spring的单例是怎么实现的?(单例注册表)

  • 为什么要单独实现⼀个服务治理框架?(说了下内部刚搞微服务不久,主要对服务进⾏⼀些监控和性能优化)

  • 谁主导的?内部还在使⽤么?

  • 逆向有想过怎么做成通⽤么?

  • 有什么想问的么?

三⾯

⼆⾯⽼⼤⾯完后就直接HR⾯了,主要问了些职业发展、是否有其他offer、以及⼊职意向等问题,顺便说了下公司的福利待遇等,都⽐᫾常规啦。不过要说的是⼿上有其他offer或者⼤⼚经历会有⼀定加分。

⼩结

拼多多的⾯试流程就简单许多,毕竟是⼀个成⽴三年多的公司。⾯试难度中规中矩,只要基础扎实应该不是问题。但不得不说⼯作强度很⼤,开始⾯试前HR就提前和我确认能否接受这样强度的⼯作,想来的⽼铁还是要做好准备。

蚂蚁⾦服面试

⼀⾯

⼀⾯就做了⼀道算法题,要求两⼩时内完成,给了⻓度为N的有重复元素的数组,要求输出第10⼤的数。典型的TopK问题,快排算法搞定。

⼆⾯

  • ⾃我介绍下呗

  • 开源项⽬贡献过代码么?(Dubbo提过⼀个打印accesslog的bug算么)

  • ⽬前在部⻔做什么,业务简单介绍下,内部有哪些系统,作⽤和交互过程说下Dubbo踩过哪些坑,分别是怎么解决的?

  • 开始进⼊正题,说下你对线程安全的理解

  • 事务有哪些特性?(ACID)

  • 怎么理解原⼦性?

  • 乐观锁和悲观锁的区别?

  • HashMap为什么不是线程安全的?

  • jdk1.8对ConcurrentHashMap做了哪些优化?

  • redis主从机制了解么?怎么实现的?

  • 有过GC调优的经历么?(有点虚,答得不是很好)

  • 有什么想问的么?

三⾯

  • 简单⾃我介绍下

  • 监控系统怎么做的,分为哪些模块,模块之间怎么交互的?⽤的什么数据库?(MySQL)

  • 使⽤什么存储引擎,为什么使⽤InnnoDB?(⽀持事务、聚簇索引、MVCC)

  • 订单表有做拆分么,怎么拆的?(垂直拆分和⽔平拆分)

  • ⽔平拆分后查询过程描述下

  • 如果落到某个分⽚的数据很⼤怎么办?

  • 哈希取模会有什么问题么?

  • 分库分表后怎么解决读写压⼒?(⼀主多从、多主多从)

  • 拆分后主键怎么保证惟⼀?(UUID、Snowflake算法)

  • Snowflake⽣成的ID是全局递增唯⼀么?

  • 怎么实现全局递增的唯⼀ID?

  • Mysql的索引结构说下

  • 主键索引和普通索引的区别(主键索引的叶⼦结点存放了整⾏记录,普通索引的叶⼦结点存

  • 放了主键ID,查询的时候需要做⼀次回表查询)⼀定要回表查询么?(不⼀定,当查询的字段

  • 刚好是索引的字段或者索引的⼀部分,就可以不⽤回表,这也是索引覆盖的原理)

  • 你们系统⽬前的瓶颈在哪⾥?

  • 你打算怎么优化?简要说下你的优化思路

  • 有什么想问我么?

 

字节跳动(百度)面试

⼀⾯

  • 先⾃我介绍下
  • 聊项⽬,逆向系统是什么意思
  • 聊项⽬,逆向系统⽤了哪些技术
  • 线程池的线程数怎么确定?
  • 如果是IO操作为主怎么确定?
  • 如果计算型操作⼜怎么确定?
  • Redis熟悉么,了解哪些数据结构?
  • 红⿊树了解么,时间复杂度?(说了是N叉平衡树,O(logN))
  • 既然两个数据结构时间复杂度都是O(logN),zset为什么不⽤红⿊树(跳表实现简单,踩坑成本低,红⿊树每次插⼊都要通过旋转以维持平衡,实现复杂)
  • CAS了解么?(说了CAS的实现)还了解其他同步机制么?
  • 那我们做⼀道题吧,数组A,2*n个元素,n个奇数、n个偶数,设计⼀个算法,使得数组奇数
  • 下标位置放置的都是奇数,偶数下标位置放置的都是偶数
  • 时间差不多了,先到这吧。你有什么想问我的?

⼆⾯

  • ⾯试官和蔼很多,你先介绍下⾃⼰吧
  • 你对服务治理怎么理解的?
  • 项⽬中的限流怎么实现的?(Guava ratelimiter,令牌桶算法)
  • 具体怎么实现的?(要点是固定速率且令牌数有限)
  • 如果突然很多线程同时请求令牌,有什么问题?(导致很多请求积压,线程阻塞)
  • 如果不⽤消息队列怎么解决?(说了RateLimiter预消费的策略)
  • 分布式追踪的上下⽂是怎么存储和传递的?
  • Dubbo的RpcContext是怎么传递的?
  • 你说的内存泄漏具体是怎么产⽣的?
  • 线程池的线程是不是必须⼿动remove才可以回收value?
  • 可是主线程不是都退出了,引⽤的对象不应该会主动回收么?
  • 那你说下SpringMVC不同⽤户登录的信息怎么保证线程安全的?
  • 这个直接⽤ThreadLocal不就可以么,你⻅过SpringMVC有锁实现的代码么?
  • 我们聊聊mysql吧,说下索引结构(说了B+树)
  • 为什么使⽤B+树?
  • 什么是索引覆盖?
  • Java为什么要设计双亲委派模型?
  • 什么时候需要⾃定义类加载器?
  • 我们做⼀道题吧,⼿写⼀个对象池?
  • 有什么想问我的么?(感觉我很多点都没答好,是不是挂了(结果真的是)

⼩结

头条的⾯试确实很专业,每次⾯试官会提前给你发⼀个视频链接,然后准点开始⾯试,⽽且考察的点都比较全

总结

从年前开始⾯试到头条⾯完⼤概⼀个多⽉的时间,真的有点身⼼俱疲的感觉。最后拿到了拼多多、蚂蚁的offer,还是蛮幸运的。头条的⾯试对我帮助很⼤,再次感谢⾯试官对我的诚恳建议,以及拼多多的HR对我的啰嗦的问题详细解答。

专业技能如何掌握?

  • 计算机网络、数据结构、算法、操作系统等课内基础知识:掌握.
  • Java基础知识:掌握
  • JVM虚拟机(Java内存区域、虚拟机垃圾算法、虚拟垃圾收集器、JVM内存管理)∶掌握
  • 高并发、高可用、高性能系统开发︰掌握
  • Struts2、Spring、Hibernate、Ajax、Mybatis、JQuery :掌握.
  • SSH整合、SSM整合、SOA架构:掌握
  • Dubbo:掌握
  • Zookeeper:掌握
  • 常见消息队列:掌握.
  • Linux:掌握
  • MySQL常见的优化手段:掌握
  • Spring Boot +Spring Cloud +Docker:了解
  • Hadoop 生态相关技术中的HDFS、Storm、MapReduce、Hive、Hbase :了解. Python基础、一些常见第三方库比如OpenCV、wxpy、wordcloud、matplotlib:熟悉

如果还不清楚自己如何准备面试,我自己用xmind手绘了一份:Java面试梳理,这样更加直观形象⼀点,细化到某个知识点,要把每⼀个知识点都搞得很熟悉,还要分清主次。

资料分享

面试突击手册

这份面试突击手册涵盖了备战面试,Java基础+集合+多线程+JVM,计算机,数据库,常用框架,系统设计常用面试题,整体分为当季最新系列、大厂面试真题系列、技术系统分类系列三部分。(纯文字文本占内存46.97MB)

备战面试

1.1 校招/社招求职指南

1.2 程序员简历就该这样写

1.3 大部分程序员在面试前很关心的一些问题

1.4如何学习?学会各种框架有必要吗?

Java基础+集合+多线程+JVM

Java基础

集合

多线程

JVM

三、计算机基础

四、数据库面试题总结

sbs

 

六、系统设计

算法这一块,可以刷看这本《leetcode刷题笔记》,此pdf书籍:主要关注经典的算法,但同时会为读者理解基本算法问题和解决问题打下很好的基础。分别介绍了字符串,栈和队列,树排序,查找,暴力枚举法,广度优先搜索,动态规划,图等内容。且每一章结束的时候均有练习题和参考资料,这为读者的自我检查以及进一步学习提供了较多的便利。

大厂面试:

转发此文关注我后添加小助理vx:mxzFAFAFA获取大厂面试资料以及文章中更多面试资料

 

点到为止,今天的分享就到这里结束,篇幅已太长,而要分享的东西也实在是太多了,小编就不在一一列举了,各位小伙伴们,如需下载我在本文所涉及的全部的Java面试突击手册+学习资源等,皆可100%发送给你!

——请注意获取方式:添加小助理vx:mxzFAFAFA获取大厂面试资料以及文章中更多面试资料