【秋招面经总结】菜逼的坎坷之路(JAVA后台研发)
写在前面
楼主是北邮真.渣硕,之前天真地认为实习期间活儿干完了就能转正,就没有准备提前批,也几乎完美错过了9月秋招正式批。倒在亚马逊的转正答辩后(感到痛心,舍不得组里和善的大佬们,技术好又有耐心又有趣),10月正式踏上秋招,目标是JAVA后台研发。至此告一段落,虽然没拿到什么牛逼的offer,但好歹互联网大厂基本都面了,写下来让自己以后复习,也算回馈牛客。
话不多说,面试问题几乎集中在JAVA基础、JVM、算法、数据库(MySQL、Redis)、计算机网络、操作系统等方面,会分类进行列举,限于篇幅项目相关的问题就不写出了。
高频问题
后面面经挺长的,嫌太长的可以只看这部分。基本上你在简历的技能树上写了以下关键词,那这些高频问题你会特别眼熟,有些会附上解答,有写错的地方欢迎指正~(敲黑板,这都是要考的重点)
设计模式
- 单例模式
- 懒汉、饿汉、双重校验锁、静态内部类
- 工厂模式
JAVA基础
- 抽象类和接口区别
- 集合类的结构
- Iterator、Collection(List、Set、Queue)、Map
- ArrayList和LinkedList的区别
HashMap
- 底层结构
- 数组 + 链表
- Put 的过程
- 为什么长度是2的倍数
- 找索引时 key 的 hash 值与数组的长度值减 1 进行与运算,长度为 2 的倍数时能减少碰撞
- JDK 1.7 和 1.8 中 HashMap 的区别
- 1.8 增加红黑树、头插变为尾插、扩容后元素位置要么在原位置,要么在原位置 + 扩容前旧容量
- 为什么线程不安全
- 扩容时链表可能形成闭环
- ConcurrentHashMap 怎么保证线程安全
- ConcurrentHashMap 和 HashMap 区别
线程池
- 线程池常用参数
- 核心线程数、最大线程数、阻塞队列、线程最大存活时间
- 线程池工作流程
- 线程池的类别和区别
- 阻塞队列的类别和区别
JVM
- 内存结构和各自存放的内容
- 方法区、堆、虚拟机栈、本地方法栈、程序计数器
- 新生代和老年代垃圾回收算法
- 新生代 -> 复制,老年代 -> 标记-整理(CMS用的标记-清除)
- CMS/G1的流程
- 初始标记 -> 并发标记 -> 重新标记 -> 并发清除
- CMS/G1的特点和区别
- CMS:尽可能减少停顿时间,采用标记-清除,会造成内存碎片化
- G1:可以预测停顿时间,采用标记-整理,减少内存碎片化, 将内存划分为 region 粒度
- 判断垃圾是否可以回收的方法
- 引用计数法、可达性分析法
- 哪些对象可以作为GC ROOT
Spring
- IOC 和 AOP 的含义和原理
- Spring、SpringBoot、SpringMVC 的区别
- SpringBoot 的启动流程
- Bean 的生命周期
- SpringMVC 的流程
MySQL
事务
- 什么是事务
- 事务的特性(ACID),详细说明各个特性的含义
- 原子性、一致性、隔离性、持久性
- 事务隔离级别
- 未提交读 -> 已提交读 -> 可重复读 -> 串行化
- 脏读、不可重复读、幻读的区别
- 事务隔离级别怎么实现预防上述问题(eg: 可重复读怎么实现预防不可重复读)
索引
- 常用索引(B树、Hash)
- 聚簇索引和非聚簇索引的区别
- 联合索引和单个索引的区别,联合索引的最左匹配原则
- B树和B+树的区别
- B+树的非叶子节点不保存数据,所以磁盘页能容纳更多节点元素,更“矮胖”
- B+树查询必须查找到叶子节点,B树只要匹配到即可不用管元素位置,因此B+树查找更稳定(也不慢)
- 对于范围查找来说,B+树只需遍历叶子节点链表即可,B树却需要重复地中序遍历
Redis
- Redis 的五种数据结构
- String、Hash、List、Set、Zset(SortSet)
- Redis 为什么快
- 纯内存、单线程、IO多路复用(一般会继续问IO多路复用相关问题)
- Redis 持久化
- RDB、AOF
- Redis 高可用
- 哨兵机制、Redis Cluster、持久化(上面那个)
计算机网络
- 点击一个URL到页面返回,发生了什么
- 客户端传给服务端时经过 TCP/IP 四层模型,中途依次加入HTTP报文、TCP报文、IP报文、MAC报文,然后逆序依次拆包
- OSI 七层模型 & TCP/IP 四层模型
- cookie 和 session 的区别
TCP & UDP
- TCP 三次握手,四次挥手的流程(最好能画图,说明各阶段状态)
- 为什么需要三次握手
- 防止已过期的连接再次传到被连接的主机
- 为什么需要四次挥手 / 断开连接时为什么比建立连接多一次
- 服务端的 ACK 和 FIN 一般都会分开发送,ACK 表示自己收到了客户端的断开请求(但还有数据没传输完),FIN 表示自己传输完了数据
- TCP 和 UDP 的区别
- TIME_WAIT 的作用
- 保证客户端发送的最后一个ACK报文能够到达服务器
- 防止类似与“三次握手”中提到了的“已经失效的连接请求报文段”出现在本连接中。客户端发送完最后一个确认报文后,在这个2MSL时间中,就可以使本连接持续的时间内所产生的所有报文段都从网络中消失
HTTPS
- HTTPS的优势
- CA证书认证、加密传输
- HTTPS建立连接流程
- 为什么传输过程中采用对称加密,协商时采用非对称加密
- 对称加密快
操作系统
进程 & 线程
- 进程和线程的区别
- 进程间通信方式
- 管道、消息队列、信号量、共享内存
- 线程间通信方式
- 消息队列、全局变量
Linux(几乎为Linux命令)
- 查找某个进程(ps aux |grep threadId)
- 杀掉某个进程(kill,参数添加-9表示强制执行)
- 查看某个端口是否被占用(netstat -anp |grep threadId)
- 实时查看进程状态(top)
算法
- 最大子序列和
- 反转链表
- 数组中查找两数之和为K的序列对
坎坷面经
大家可以找找上面的高频问题在下面的面试中也出现过多少次(笑),针对每个公司会有一个小结(碎碎念)。
按照顺序分别是:
腾讯 - 阿里 - 美团 - 字节跳动 - 京东 - 网易
携程 - 旷视 - 新浪 - 小米 - 搜狐 - 快手
Paypal - FreeWheel
乐元素 - SmartX - 当当
腾讯-医疗
一面
MySQL
- 事务的特性
- 如何删除表中的所有数据,delete和truncate的区别
- char, varchar, text的区别
- 一张表里数据量大,慢查询怎么办
Redis
- redis 的数据结构
- zset 的底层结构
- redis 的常用命令
操作系统
- 多线程和多进程的区别
- 进程间通信方式
- 线程间通信方式
计算机网络
- TCP 三次握手,四次挥手
- TCP 和 UDP 的区别
- UDP 如何重组数据
- 应用层和网络层是干嘛的
- ARP 是网络层的吗
腾讯-地图
一面
MySQL
- MySQL 引擎默认的隔离等级
- MySQL 有哪些锁
- 执行 select 和 update 会如何加锁
计算机网络
- TCP和UDP的区别
- TCP和UDP的报文头内容
- HTTP
- HTTP属于 TCP 还是 UDP
- HTTP 1.1比1.0多了什么
- HTTP Request Header 中有哪些内容
- 如何判断是否是长连接
- DNS 属于 TCP 还是 UDP,原理
- Ping 使用的什么协议,原理
操作系统
- 进程和线程区别
- Linux进程有哪几种状态
- Linux查找某个进程
算法
- 二分查找
- 最大子序列和
腾讯-小结
可以看出腾讯对于计算机网络方面的知识要求蛮多的,光熟悉 TCP、UDP、HTTP 相关这样基础的面试题是hold不住面试官的
楼主目前在开发中还没用到过计算机网络的知识去解决问题,但前人的经验告诉我们后台系统多半会遇到网络拥堵的情况,这个时候计算机网络就能派上用场了(帮助定位问题,调 bug)
阿里-健康
一面
JAVA
- HashMap原理,用红黑树解决什么问题
MySQL
- B+树的原理和优势
算法
- 硬盘中有10G数据,内存1G,如何排序(多路归并排序)
- 最大子序列和,除了动态规划还能怎么做
阿里-高德
一面
数据库
- delete 和 truncate 区别
- 如果索引值为null,走不走索引
JAVA
- 常见的单例写法
JVM
- 新生代和老年代的区别
- 大量大对象进入老年代会有什么问题(频繁触发full GC)
- 有很多个大对象,应该如何改进
开放式
- 如何设计一个查询附近商家的功能
二面
开放式
- 爬虫爬千万个手机号码,如何统计每个手机号码的出现次数
阿里-小结
阿里对于算法方面的考核会更加严格,普通的算法题期待你有多种解法,并且倾向于给你一个具体问题让你解决,然而我开放式问题都答得不咋样
开放式问题一般都是大的业务问题(数据量大、用户量大(高并发场景)等等),需要衡量业务是正确稳定至上还是效率至上(同步、异步),还有资源消耗(空间换时间、分布式会导致调度的额外开销),尝试将大问题分解,自上而下/自下而上去解决
美团-金融
一面
JVM
- JVM的结构
- 新生代和老年代的垃圾回收算法
- 虚拟机栈和本地方法栈的区别
- 类信息会加载到JVM哪个区域
JAVA基础
- HashMap 和 ConcurrentHashMap 的区别
- final 的作用,加在变量、方法、类的区别
- 新建一个 string 会创建几个对象
- 哪些类是线程安全的
- 线程池的参数;为什么需要超出最大容量的策略
- ThreadLocal了解吗
Spring
- AOP的实现原理
- @Autowired和@Resource的区别
- 什么情况下会用@Resource
MySQL
- B+树的优势
- 悲观锁和乐观锁了解吗
- 数据库如何实现乐观锁
设计模式
- 工厂模式怎么理解
- 单例模式有哪几种实现方式
- 懒汉和饿汉的区别,懒汉的缺点
算法
- 反转链表
二面
JAVA基础
- HashMap 和 ConcurrentHashMap 的区别
- hash 冲撞怎么办?如何 rehash
- HashMap 的遍历方式
- 为什么 HashMap 是线程不安全的
- volatile 和 synchronized 的区别
Spring
- SpringBoot 的优势
- SpringMVC 的 MVC 指什么?好处呢
Redis
- 主从结构了解吗
- 宕机之后如何恢复数据
消息队列
- rabbitmq 和 kafka 的区别
- rabbitmq 如何保证事务
- 消息队列的优势
美团-数据平台
一面
JAVA基础
- ConcurrentHashMap 的特点
- JUC 包下其他并发类了解过吗
- 多个消费者生产者,如何处理同一段数据(消费者-生产者模型)
操作系统
- 线程间通信的方式
JVM
- 阐述 JMM 内存模型
- 垃圾回收算法有哪些
- 标记-整理会触发 Stop The World 吗
- 什么情况下触发mirror GC
- JVM 结构
- 新建的字符串会存到哪
消息队列
- 设计时应该考虑什么问题
- 如何保证高可用
算法
- n个有序数组,找出 Top k
美团-到家
一面
JVM
- JVM 存在的优势
- 通过什么方式来判断是否回收
- 哪些对象可以当 GC root
- 虚拟机栈的对象为什么能当 root
- 堆和栈区别
JAVA基础
- ArrayList 和 LinkedList区别
- HashMap 的底层数据结构
- JDK 1.8 中 HashMap 有哪些变化
- 静态变量和非静态变量的区别
- 类和对象的区别
- Synchronized 和 Lock 区别
- Lock 底层实现
- Exception 和 Error 的区别
- 线程池常用参数
- 在什么情况下使用这些参数(线程池工作流程)
设计模式
- 手撕单例模式的双重检验锁
- 为什么要有两次检验
Redis
- Redis 为什么快
- Redis 如何保证可用
MySQL
- B树索引和hash索引区别
- 聚簇索引和非聚簇索引
计算机网络
- HTTPS 建立连接流程
算法
- LeetCode11 water
- 给定一个数,通过调换顺序,找到比这个数大的最小数
美团-餐饮
一面
Spring
- 循环依赖,可以初始化成功吗
其他问题比较简单没印象了
二面
JVM
- CMS和G1
JAVA基础
- HashMap 和 HashTable 区别
- ConcurrentHashMap 和 HashMap 有什么不同
- 阐述乐观锁,悲观锁
- 阐述 CAS
MySQL
- B+和B树的区别
- Innodb 和 Mysiam 索引区别
- left join, right join 区别
- 联合索引和普通索引的区别
- 事务隔离等级
- 事务特性(ACID)
- 慢查询如何排查
- explain 中 index 和 ref 区别
美团-小结
原来美团我面了这么多次,侧面反映我有多菜了(逃)。
美团会挖你使用原理,考察你是不是真正用过这个东西而不仅仅是在博客上看了些相关的热门面试题(虽然回头来看这些题也挺基础的吧),换个角度讲即是连环炮问题的个数会变多,所以在准备相关知识点的时候需要看得细致一点,不光是知道这个点的用途,还需要知道详细的用法、为什么这么设计就能达到理想的效果,针对这个点还有没有优化空间
字节跳动-未知部门
一面
JAVA基础
- ArrayList 和 LinkedList 的区别
- 为什么 ArrayList 可以直接访问到元素
- HashMap 的内部数据结构
- 除了Map还可以怎么实现key value结构
- Synchronize是公平锁吗,可重入吗
- Lock 和 Synchronize 的区别
- Exception和Error的区别
- OutOfMemoryError(OOM) 可能是哪些原因导致的
- 并发控制可以用哪些方式实现
- 线程池的大小应该如何设置
- 一个类里有两个synchronize方法method1和method2, 如果有两个线程分别执行method1和method2,他们是串行执行还是并行执行
JVM
- 堆和栈的区别
- 递归调用是在堆上还是栈上
计算机网络
- 阐述 TCP 连接流程
- TCP 为什么需要第三次握手
- HTTPS 和 HTTP 的区别
- HTTPS 如何建立通信
- 为什么要用对称加密 key 加密信息,而不用公钥直接加密信息
MySQL
- 联合索引A,B,C,直接查询C走不走索引,A,C呢,A,B呢
- 了解SQL注入吗
- 从服务端如何防止SQL注入
算法
- 反转字符串 (you me)-> (me you)
- 如果上面输入的是一个char[]呢,不通过辅助操作char数组
字节跳动-国际支付
一面
JAVA基础
- 重写 equal 为什么要重写 hashcode
- 抽象类和接口区别
- List 和 Set 区别
- HashMap 的实现结构,hashcode 方式
计算机网络
- HTTP 状态码4XX和5XX的区别
- GET 和 POST 区别
MySQL
- 事务特性
- 事务隔离等级
算法
- 求二叉树中左叶子节点的总和
二面
Redis
- zset 的底层原理
- String 的底层原理
算法
- 链表对折 1 -> 2 -> 3 -> 4 -> 5 ----> 1 -> 5 -> 2 -> 4 -> 3
字节跳动-小结
宇宙条也爱抠原理,准确说互联网大厂都会问原理吧。回看问题觉得问得也不是很难,都是比较基础的知识,比如并发控制中的 Synchronize 和 Lock ,奈何我用得太少,这些关键字最好是自己能写个小 demo 来验证一下效果,不然光看别人的博客写得头头是道,临场了根本记不住那么多
京东-优惠券
一面
Redis
- 基本数据结构
- 持久化策略
- 如何提高 Redis 的性能
消息队列
- 如何保证可靠性
- 如何保证消息的幂等性
JAVA基础
- HashMap 线程安全吗?如果要线程安全怎么办
- ConcurrentHashMap 怎么实现线程安全
- volitale 怎么保证可见性
JVM
- JVM 结构
- 常量存在哪里
- 如果有一个大对象,垃圾回收是怎么进行的
Spring
- IOC 和 AOP 的底层原理
京东-数据产品(offer)
一面
JVM
- 栈的结构
- 阐述 CMS
Redis
- Redis 为什么快
- IO多路复用为什么快
算法
- 二叉树的层次遍历
二面
MySQL
- left join、right join、inner join 的区别
设计模式
- 阐述工厂模式及应用场景
算法
- 翻转链表
- 一个二维数组,从左往右递增,从上往下递增,问数组中是否存在数K
- 64匹马,8个赛道,只能知道马的名次而不知道具体时间,如何最少次数找出最快的4匹马
京东-虚拟商品交易
一面
JAVA基础
- 阐述泛型
JVM
- G1的特点
Spring
- 阐述 AOP
TCP
- 三次握手时的各个状态
- TIME_WAIT 的意义
- 阐述慢启动
MySQL
- B+和B树区别
- 阐述聚簇索引
二面
JAVA基础
- HashMap Put过程
- HashMap 扩容时,为什么扩两倍
三面
- 觉得前两个面试官如何
京东-小结
京东问的问题大多停留在阐述概念,当然有些是我不会面试官就没往下深问了,整体还是偏简单的。数据产品能拿到 offer 可能归功于算法题太简单了(赛马那道除外),很流畅地就写完了,我会告诉你我一周写了三次反转链表吗
网易-有道
一面
JAVA基础
- 线程池的属性
- 为什么需要线程池
- 可以用哪些方法来线程同步
- 阐述 Synchronize, Lock
- HashMap 线程安全吗?如何线程安全
- ConcurrentHashMap 如何实现线程安全
- atomic 类了解吗,原理
- Synchronize 的原理
- AQS(AbstractQueuedSynchronizer)了解吗
操作系统
- 创建线程有哪些开销
计算机网络
- 阐述 TCP 四次挥手
- TIME_WAIT 等待多久
Linux
- 如何找出状态为 TIME_WAIT 的 TCP 连接
- grep 原理,需要消耗哪些资源
MySQL
- 事务隔离等级
- 已提交读和可重复读的区别
- 不可重复读是什么
- 可重复读如何解决不可重复读
- select for update 和 select 的区别
算法
- 二叉树右视图
网易-小结
笔试之后两个月才面试可等死我了,问了不少多线程开发的问题,可惜我没做过这个,有空得写写 demo 熟悉下线程池,其他基本是常规问题
携程-途家
一面
JAVA基础
- 死锁了解吗,写一个死锁
MySQL
- 联合索引(a,b,c)什么情况下适用
- 事务隔离等级
- 脏读是什么
二面
JAVA基础
- String 的特点,怎么实现值不可变
- a = "1",b = "2",c = "12",d = "1" + "2",e = a + b,问 c d e 两两之间是否 == / equal
- Synchronize 的原理
- 锁膨胀的过程
- 自旋锁的好处
- HashMap 查找复杂度,如何实现的
- HashMap 如何扩容,为什么长度是2的幂次
- HashMap 初始化默认长度,初始化长度为7会怎么样
- HashMap 在 JDK 1.8有什么改进
- HashMap 链表什么时候转红黑树
- 为什么8转红黑树,6退化为链表
- HashMap 为什么线程不安全
- ConcurrentHashMap 为什么线程安全
- ConcurrentHashMap 锁分段在1.8怎么实现
JVM
- CMS,G1 等垃圾回收器了解吗
- 老年代年轻代用什么回收算法
- 垃圾回收的判断方法
- 引用计数法的缺陷
- 哪些可以当做 GC root
- 如果在老年代中有对象引用年轻代的对象,回收年轻代的时候怎么处理
MySQL
- 事务隔离等级
- 幻读会发生在哪一级
- MySQL 如何防止幻读
- B+树的好处
- B+树非叶子节点只放索引的好处
- select where a > 3 and a < 10 和 where between 的区别
- 数据库如何加行级锁
- 快照读怎么实现的
Redis
- 缓存淘汰算法有哪些
算法
- 二叉树两个节点的最近公共祖先
携程-小结
看得出来这个面试官非常喜欢 HashMap,面试中只要涉及到 JAVA 的集合类,准少不了 HashMap,如果接着问到线程安全方面,那多半会引出ConcurrentHashMap,关于这俩的问题也不少,仔细消化一下吧
旷视
一面
计算机网络
- 阐述TCP连接流程
算法
- 二叉树右视图
- 一个数组,只有0和1,指定一个数k,返回最多将k个0变为1后最大的连续1子序列长度
二面
算法
- 复数计算(字符串处理)
- 二分查找
- 一个数组arr,每次pop一个数arr[i],sum+=arr[i-1] * arr[i] * arr[i+1],求sum的最大值
三面
计算机网络
- HTTP如何保持长连接
- 客户端还是服务端记录长连接
- session 和 cookie 的区别
- cookie 在传输中放在 HTTP 报文的哪里
旷视-小结
人工智能出身的公司对算法比较看重,但是除了最后那道动态规划其他算法题属于简单的类型。(面试中让写复杂动态规划的情况很少,一般考察的题目代码会比较简短)因为旷视技术栈不是 JAVA,所以就没问 JAVA 相关的,转而问了些计算机网络的东西,也不算很难。三面的面试官有些敷衍,觉得我的项目比较简单(第一次被这么说,果然是其他面试官太温柔了不好意思说),没什么想问我的就草草结束了
新浪-金融
一面
JVM
- JVM 分区,哪些会发生溢出
- 怎么让栈溢出
MySQL
- 慢查询 SQL 怎么排查
计算机网络
- HTTPS 的流程
- 点击 URL 的流转过程
算法
- 判断回文数
二面
JAVA基础
- JAVA 和 C 的区别
- 如何体现面向对象
- 什么是多态
算法
- 从1亿个数找出前10
- 从1亿个数大概率找出某个数
- 布隆过滤原理,怎么减少碰撞
MySQL
- 什么是事务
- 事务的特性详细说一下
新浪-小结
中规中矩的面试题,该有的部分都没落下。布隆过滤器只是看过概念没有深究,原理和优化需要再品一下。这些经常听到的数据结构(诸如堆、并查集、字典树、AVL树等),可以多看看,再找几道题目实践一下,防患于未然
小米-中间件
一面
JAVA基础
- JDK 1.8 HashMap 有哪些变化
- 如何保证 Map 有序
- Synchronize 的底层原理
- Lock 的底层原理
- 线程池参数
- 线程池执行流程
Spring - Spring Bean 的生命周期
JVM
- 分区结构
- 垃圾回收算法
- 阐述 G1
MySQL
- 事务特征(ACID)
- 事务隔离等级
- 可重复读和已提交读的区别
- 不可重复读和脏读的区别
- 阐述B+树索引
算法
- 反转链表
- 单例模式
- 上楼梯(斐波拉契数列) LeetCode 70
二面
算法
- 平衡二叉树 LeetCode 110
小米-小爱
一面
Spring
- IOC 的好处
算法
- 二叉树中的最大路径和 LeetCode 124
二面
算法
- 翻转链表
- 顺时针遍历矩阵
Redis
- 缓存击穿怎么处理
JAVA基础
- Throwable 下的类结构
- RunTimeException 和非 RunTimeException 区别
- 线程池的种类
- CPU 密集型任务和 IO 密集型任务的区别,分别怎么设置线程数
- 写一个使用 volatile 而可以不用 synchronize 的场景
Spring
- @autocofiguration 的好处
- SpringBoot 比 SpringMVC 的优势
- MVC分层的好处
其他
- zk了解吗
- 函数式编程了解吗
- Spark了解吗
小米-有品(offer)
一面
操作系统
- 进程和线程的区别
- 进程间通信方式
- 一个进程最多可以开多少线程
- select 和 epoll 的区别
- 阐述同步/异步
计算机网络
- TCP TIME_WAIT 作用
- 阐述 TCP 拥塞控制和流量控制
二面
MySQL
- B+树索引结构
- B+树的深度如何增加(增加元素的过程)
- B*树了解吗
操作系统
- Redis 在执行 RDB 时,如果子进程需要拷贝的内容超过内存的一半可能会出现什么问题
开放式
- 设计一个单机版炉石
小米-小结
面中间件部门的时候,之前面得有些疲倦,有些消极面试,导致基础问题答得还可以,但简单的算法题都没有撕出来。
面小爱部门的时候,情况恰好反过来,基础问题几乎一问三不知,面对在面经中没看到过的题目有些懵了。
秋招是条长阵线,过程中需要随时调整心态,没拿到 offer 的时候要能克服沮丧本能去复盘,至少针对没答上的问题去搜索答案,坚持每天刷1-2道题。
感谢我的学长K神捞了我一把,有品的面试官很 nice,问的问题你如果不会的话都详细地进行了解答而不是赶紧跳到下一个。二面面试官穿了件炉石主题的卫衣,就很巧扯到了炉石,然后让我设计这么一个游戏跨度就很大。有品面下来感觉一半时间都是面试官在说,也算是我运气好吧
搜狐
一面
忘了
二面
MySQL
- 常用索引类型
- B+树和B树区别
- M阶B树最多几个节点,最少几个节点
- 慢查询如何排查
- 什么情况下不走索引
Redis
- 基础数据结构
- 数据结构底层原理
Spring
- 注解的原理
- 有一个日志注解,分别写在A和B上,A用到了B,打印时是输出执行AB还是执行A
消息队列
- 内部结构
Mybatis
- 怎么自己实现数据库对象和JAVA对象的映射
JVM
- JVM 结构
- 类如何加载到 JVM 中
JAVA基础
- volatile的特点
- ThreadLocal的作用
- 新建字符串会生成几个对象
- Integer i=127;Integer j=127 i==j?
计算机网络
- 阐述TCP四次挥手
- 什么情况下会出现大量TIME_WAIT?怎么解决
搜狐-小结
搜狐怪自己对已经使用过的工具了解得不够深入,比如 MyBatis、Spring 等, 用时一时爽,却没有对背后的实现过程深究,还是别犯懒
快手
一面
计算机网络
- 阐述 TCP 拥塞控制和滑动窗口
操作系统
- 进程和线程区别
- 物理地址和逻辑地址区别
算法
- 找出最小 Top K(大根堆)
- 给定二叉树和k,是否存在从根节点到叶节点的路径和为k
二面
算法
- 单链表排序
- 二叉排序树找 a,b 的公共祖先节点
快手-小结
快手应该是倒在算法上了,刷的题还是太少了,以后不要口头 AC,要手敲,现场代码写得流畅真的会很加分
Paypal
一面
Spring
- 深入了解过 Spring & SpringBoot 吗
- IOC(控制反转)和DI(依赖注入)的区别
Java基础
- final, finally, finalize 的区别
- final 修饰的变量是引用不可变,还是值不可变
- HashMap 和 HashTable 的区别
- HashMap 线程不安全怎么体现,HashTable 怎么解决的
开放式
- 当请求随机出错,怎么排查问题
- 请求结果不一致,可能是怎么导致的
二面
英文自我介绍
JAVA基础
- 新建一个字符串,会建几个对象,指向堆上的对象还是常量池的
- JAVA 对象和 MySQL 对象是如何映射的
- 死锁了解吗
JVM
- 内存结构
- 类的加载过程
Maven
- 怎么使用 Maven
- 如何加载同一个 Library 的两个版本
Spring
- SpringMVC 的请求流程
- 参数校验在哪一层实现
MySQL
- 查询慢,怎么排查问题
- 数据库和缓存如何做读写同步
三面
Redis
- Redis 为什么效率高
- 阐述非阻塞的IO多路复用
JAVA
- HashMap 的底层数据结构,线程安全吗,为什么
- ConcurrentHashMap 如何实现线程安全,如何保证扩容时候的线程安全
MySQL
- 事务是什么,ACID是什么
- 常见索引(B树,Hash)
- 聚集索引是什么,和非聚集的区别,用什么实现
算法
- 查找一个旋转数组中的某个数
Paypal-小结
都是线上面,这里我犯了一个错误,之前被问过的问题没有完全消化掉,比如问到Redis为什么快的时候,只要你回答了IO多路复用,那面试官肯定会接着问你IO多路复用是什么,优势是什么,怎么实现的,后面俩问题我当时还没去看就只有尬住。遇到不会的问题,不要仅限于这个问题本身的答案,还要去挖掘相关联的问题答案
FreeWheel
一面
算法
- 非递归的后序遍历
MySQL
- 阐述 group_contact
- 如何加快数据库查询速度
Redis
- Redis 如何保证安全性
JAVA基础
- 如何教一个初学者 JAVA
开放式
- 12306登录时,页面一直卡住会是什么原因导致
二面
- 英文自我介绍
Git
- git rebase 作用
算法
- 给一个字符串,元素都是26个字母之一,现将字符串分割,让相同的字母在一个子串中
- 给定一个数组和k,返回数组两数之和为k的两数位置,改为三数呢
FreeWheel-小结
外企对英文水平是有要求的,两面都用英文说了一段,可怜我的垃圾工地英语。一面中如何教一个初学者 JAVA 这个问题让我眼前一亮,怎么将你会的东西给一个不会的人讲清楚,十分考验你对这个知识的理解程度而不只是照搬书/博客上“官方”解释。一面面试官夸了夸我,还主动告诉我面试中应该注意的一些细节,十分感动。二面中第一道算法题写得不咋样,外企线下面主要看的还是算法,所以多刷题吧
乐元素
一面
问了问项目,这儿不赘述了
二面
算法
- 数组里全是无序的0,1,2,要求分成三堆
- 一个二维数组,每个格子是X或者空,连在一起的X代表一条船,船会横着或者竖着,但不会挨着,求船的条数
JAVA基础
- 集合类有哪些
- ArrayList 初始化容量是多少,扩容方式
- HashMap 的底层原理,扩容方式
- 为什么 ArrayList 和 HashMap 的扩容方式不同
- ConcurrentHashMap 如何保证线程安全
JVM
- 内存结构
- 垃圾回收算法
- JVM 调优会用到的一些参数
- JVM 调优的 JDK 方法
MySQL
- MySQL 有哪些索引
- B树为什么快
三面
算法
- 洗牌算法
- 给定一个硬币,正反面概率不同,怎么设计规则让双方公平
- 抛两次,一人猜一正一反,一人猜一反一正
乐元素-小结
第一次面游戏公司,感谢学弟祝大师的内推。问的算法题还挺有意思的,游戏设计涉及公平,三面的两道题都跟公平性有关,洗牌算法见过但没自己手撕过,抛硬币自己脑子没转过来,得到解答之后恍然大悟,自己的概率学还是没学好啊(笑)
SmartX
MySQL
- 阐述索引
计算机网络
- ARP 为什么属于网络层
操作系统
- 线程和进程的区别
- 线程间通信
算法
- 快排,堆排稳定吗
- 堆排序的过程
- 有一个矩阵,元素从左往右升序,从上到下升序,找出k是否存在
- 一个无序不重复数组,找出有多少对数字加起来等于k
SmartX-小结
做私有云的一家公司。快排堆排是知道原理但手撕次数太少导致不熟练,常用的排序算法(插入、冒泡、快速、堆)、链表操作(拆链表,快慢指针)、二叉树的遍历(先序、中序、后序、层次)没事就多写写,争取5分钟就能AC出来那种程度
当当
一面
JAVA基础
- HashMap 的底层数据结构,桶是什么
- 要高并发的 HashMap 怎么做
- JAVA中加锁的方式
- 多态如何体现
- 重载可以 throw Exception 吗
- Synchronize 加与不加 static 的区别
- Lock 的具体用法
- Mybatis 映射对象的原理,xml中的表是如何映射的
- 线程池常用的参数
Spring
- IOC 和 DI 的区别
- @Interface 了解吗
MySQL
- trigger 了解吗
- 现在有 A,B,C,D 四个字段,如何建索引查询最快
当当-小结
初进当当的那层楼,装修风格加上打了鸡血的横幅,给我一种铁血工厂的感觉。面试官还是挺不错的,好几个问题触及到了我的知识盲区,当时心态有些消极,没有好好回答问题,可能是被挂的原因吧
后记
秋招算是告一段落,春招可以再战。对基础的知识点需要反复重现巩固,面试中经常出现过这个题我见过但答案我记不全了的情况,可能因为一两个问题就是白菜和 sp 的差距了。多实践、多刷题、调整心态,没什么坎过不去。
不求多拼命,但求无愧于心,不留遗憾吧
感谢看到这儿的你,祝一切顺利~