背景

2016 年 CS 专业本科毕业后五年,一直在上海,一直在小公司做 Java 开发。迫于上海从 20 年底的房价飞涨,思考对比之后决定回发展,看看外面的机会。毕业这么多年还没有在大厂待过,所以进大厂一直是自己的一个目标。结合自身的情况,给自己制定了一份面试计划,大概分为以下阶段:

  • 知识体系总结回顾
  • 定位目标:我在工程和架构方面的优势是什么?我在软技能方面的长处是什么?我希望找到什么样的工作并加入什么样的团队?
  • 内推面试:感谢 v2 及帮我内推的大佬
  • 面试复盘

准备工作

知知识体系的总结其实是一个长期的过程,但是由于我比较懒,以前的学习都比较零散。我没有很系统地记录和总结,所以在复习的时候花了不少时间。在建立了知识体系之后,我将复习分为以下几个部分:

  • Java 基础&JUC&JVM
  • 过往项目经历
  • 中间件及系统设计
  • 操作系统&计算机网络
  • 算法

准备简历

简历我用的wondercv在线简历网站写的,用的免费的 Markdown 模板(非广告)。重要的是对自己简历上的东西要烂熟于心,熟练的技术栈,项目设计,为什么这么设计,项目的亮点、难点。

面试汇总

我总结了下出现比较频繁的面试题

Java 基础&JUC

  • 面向对象的设计原则
  • HashMap 的数据结构和put()方法的过程
  • 强引用、软引用、弱引用、虚引用?
    • JDK 中哪些使用到了虚引用
  • ConcurrentHashMap 下 1.7 和 1.8 的区别
    • put()方法的插入过程
    • get()方法为什么不加锁也是线程安全的
  • 线程池的参数&任务执行过程-【高频必问】
    • 线程数如何设置?队列如何选择?
    • 线程处理任务时抛异常后线程池如何处理
    • Tomcat的默认线程池为什么是 200
  • SynchronizedReentrantLock的原理及区别
    • AQS 的实现,扩展类
    • Synchronized锁优化
  • volatile的作用及原理
    • 内存屏障在编译和运行时如何使用
    • 总线风暴了解吗
  • ThreadLocal的原理、实际的使用场景
  • JDK 中常见的设计模式
  • JVMTI\JDPA

Java 虚拟机

  • 内存模型
  • 类加载机制
    • 如何破坏双亲委派机制
      • Spi jdbc
      • 如何自定义加载器
    • new Object 的过程
  • 方法调用过程,栈是如何创建的
  • 常见的垃圾回收算法和垃圾回收器
    • CMS 和 G1 的使用和调优实践
  • 分代假说
  • 线上 OOM 排查思路
  • 内存泄漏

数据库

  • MySQL 的索引结构以及使用
  • 事务的隔离级别和常见问题
    • 脏读与幻读的区别
    • 大事务如何处理?子事务之间如何保证一致性
    • next key lock ,gap 行锁,表锁
  • SQL 优化的过程
  • update 的执行过程(走索引&不走索引)
    • 普通索引
      • gap 锁 or next-key lock
    • 聚簇索引
    • 无索引
      • 表记录和间隙全部锁
  • MongoDB 的优劣

中间件

Redis

  • 单线程的 Redis 为什么快
  • 常见的数据结构及使用到的场景
  • IO 多路复用在 Redis 中是如何实现
  • 持久化机制有哪些,底层原理
  • 淘汰机制有哪些?
    • LRU 如何实现
  • 分布式锁的实现?锁过期?
    • Redison&RedLock
  • 哨兵模式和集群模式的区别?
    • Raft 算法的过程
    • 集群模式下节点的新增和移除过程
  • BigKey 和 HotKey 如何处理
  • 缓存一致性的解决方案
  • 高级的数据结构
    • bloomfilter

分库分表

  • Sharding-JDBC 的执行过程
  • Sharding-JDBC 不支持的语法
  • 如何解决不走分片键的复制查询
  • 数据倾斜如何设计一个移动数据最少的方案

MQ

  • 如何保证消息的可靠性
  • 如何保证消息的顺序性
  • 如何处理消息堆积
  • RocketMQ&Kafka&ActiveMQ 的区别
  • RocketMQ 是如何设计
    • 延迟消息如何设计
    • 死信队列
    • 消息重投
  • 生产者和消费者的负载均衡策略有哪些

框架

  • Spring

    • IOC

      • Autowired 和 Resource 的区别
    • AOP

      Spring 如何实现一个自定义扩展点

      • cglib
      • Jdk 动态代理
      • 实例化之前 AutoConfigruation BeanPostProcessor;实例化之后,判断是要需要增强,增强的话需要设置代理
    • 如何解决循环依赖

      • 三级缓存,最后一集缓存的 factoryBean 先实例化,在初始化
    • 事务如何实现,如何开启和关闭,传播机制

      • 传播机制的实现:安全点
    • SpringMVC 响应请求的步骤

    • Controller 是线程安全的吗

分布式

  • SpringBoot 的配置装配
  • Hystrix 实现的原理
    • 如何实现一个滑动窗口
  • Apollo 的配置热部署如何实现
  • Eureka 是如何在高并发下的可靠性
    • 自我保护机制的原理
    • CAP
  • SkyWalking 如何实现链路追踪
    • 如何实现日志追踪
      • 服务调用传递
      • 父子线程的传递
      • 线程池之间的传递

系统设计

  • 100 个日志文件(10M~1000G 之间)找出指定日期的日志并排序
  • 卡券系统设计
  • 秒杀系统的设计
  • 12306 抢票设计
  • 大数据量的评论系统如何设计
  • 红包雨设计–总共发 1 亿,假设 1000w,每个人最多拿 15 块,不能超卖,点点点,是有概率的,汇总
    • Redis 主从,主节点宕机

计算机网络

  • TCP 和 UDP 有什么区别?

    UDP 流媒体应用

    • 拥塞控制、滑动窗口
      • 2msl
    • 怎么实现 UDP 实现可靠传输
  • TCP 的粘包问题如何解决

  • IO 模型,IO 多路复用的差异

  • http 和 resultFul 接口的区别 rpc 的区别

    • resultFul 是一种规范
    • rpc 有自己的序列化,协议,响应快

算法

软技能

  • 你的优点和缺点
    • 举例说明优点
  • 过往经历给你带来影响最深的成长是什么
  • 未来 3 年的职业规划

总结

面了近 20 家公司,有好多不尽人意的地方,最后能够拿到 offer 还是很幸运的。补充一些小结:

  • 简历里的项目一定要好好准备,熟悉其中的技术栈、项目设计以及项目的亮点和难点。

  • 如果想进入大厂,算法是必须要好好刷一刷的。我推荐以下资源:

    到这里就全写完了, 你可以直接通过我的邮箱留言交流, 感谢您耐心地看完全文!