金山面试总结

  • 可参考的面试题解析:https://segmentfault.com/blog/shaoxia
  • 模拟面试:https://www.nowcoder.com/interview/ai/cover?discussInterviewTagId=464
  • 面试灵魂拷问:https://www.nowcoder.com/discuss/151405?source_id=&channel=

算法 / 数据结构 * 30

算法 * 29

  • 会哪些算法?
    • 排序算法
    • 滑动窗口
    • 动态规划
    • 分治法
    • 贪心算法
  • 算法怎么样

排序算法:* 10

  • 排序用过哪些?哪些是稳定排序?

  • Jdk中有关排序的方法介绍,是否了解过源码

  • 快排:* 5

    • 手撕
    • 说一下快排流程,时间复杂度,空间复杂度,什么时候出现最坏、如何优化
      • 优化:https://juejin.cn/post/6844903576037244935
    • 口头描述快排、时间复杂度、优化等
  • 堆排序:* 2

    • 手撕
    • 说一下流程,时间复杂度

DP算法:* 2

  • 打家劫舍
  • 背包问题
    • 说一下状态转移方程和流程

流量控制算法:

  • 标志桶和漏桶算法的描述以及使用场景。

树:* 4

  • 二叉树的前序中序后序遍历
  • 树的遍历方式 * 2
    • 如何遍历二叉树?如何实现层序遍历
    • *二叉树的遍历,递归和非递归
  • 寻找树的深度

其他:* 10

  • LRU * 4
    • LRUCache算法原理,举例子说明双向循环链表插入删除操作
    • LRUCache算法,自己实现一个怎么做(引出LinkedHashMap,引出线程安全问题?)
  • 滑动窗口
  • *图的遍历方式
  • 反转链表
  • 如何实现优先队列 * 2
    • 如何用堆实现优先队列
    • 优先队列怎么实现,除了使用堆
  • 口头描述最长递增子序列算法
  • 笔试题
    • 给一个链表,去掉所有,只出现过一次的节点
    • 给一个无序数组,求出第n大的数字出现的次数
    • 默写自平衡二叉搜索树<感觉有点像替罪羊树?>
    • N2复杂度求出最长回文串长度

数据结构

  • 二叉树的使用场景?跟链表的区别?举例

计算机网络 * 37

  • ip和mac地址的关系
  • 同个内网中的设备发送数据会经过什么流程
  • *浏览器地址栏输入网址整个过程 * 2
    • 只会建立一个Http吗?中间还会做其他操作吗?
  • 协议 * 32
    • http * 11
      • Http的请求过程
      • 说一下Http协议
      • Http长连接 * 3
        • 长连接和短链接区别?http是长连接还是短链接?
      • 2.0的特性,和1.1有什么区别? * 3
      • header中的字段
      • get 和 post 区别
      • *Http状态码介绍(1XX-5XX),401、405、406分别代表什么?
    • https * 4
      • https了解吗
      • 常用的对称加密和非对称加密算法有哪些
      • http和https的区别 * 2
        • 描述https通信过程,加密认证机制
    • TCP * 17
      • TCP与UDP的区别 * 3
        • 哪些协议是基于TCP/UDP的
      • 3握手4挥手 * 8
        • 为什么是三次TCP握手
        • 为什么两次握手不行
        • 三次握手和四次挥手流程
        • 通过什么判断握手和挥手
        • TCP四次挥手,什么时候断开
        • *tcp三次握手过程中,哪个阶段会出现close_wait?如果出现大量的close_wait是什么原因?如何解决?(引出常见的Linux命令及排查过程)
      • 流量控制: * 4
        • TCP滑动窗口机制 * 3
          • 说一下作用
      • 拥塞控制:* 2
        • 说一下拥塞控制算法
  • session 和 cookie 的区别 - ?

设计模式 * 6

Root: * 6

  • 会哪些设计模式,讲解一下单例模式 * 2
  • 说一两个设计模式,它的定义,怎么去用
  • 工厂模式(问的很细),优点、写法、为什么要用它 - ?
  • 用过什么设计模式?
  • 责任链模式是怎样的,跟装饰者模式区别(这个不太清楚直接说没有遇到), 还用过哪种设计模式?Java哪里用到什么设计模式?

Java * 87

基础 * 14

  • 重写重载区别
  • 怎么理解面向对象 - ? * 4
    • Java抽象、面向对象说一下,举个场景
    • 面向对象设计的场景题:设计一个,高三学生毕业后,上大学,学习某某专业,毕业后变成某行业工作人员
    • 面向对象的三大特性
  • 异常的分类图 * 3
    • 讲一下Java中的异常处理
    • 你遇到的运行时异常
  • 集合分类图
  • 接口和抽象类的区别是什么
  • Integer和int的区别
  • final关键字
  • 父类中的static为啥不能被子类覆盖?
  • StringBuffer和StringBuilder的区别?

高级 * 1

  • 反射原理是什么?应用有什么? - ?

数据结构(集合) * 27

  • 集合类讲一下 * 4
    • 用过哪些集合 * 2(引出hashmap、List等)
    • 说说你所知道的集合,并说说内部实现
  • HashMap 和ConcurrentHashMap的底层实现及区别 * 15
    • ConcurrentHashMap 的优化点,性能怎么样
    • HashMap数据结构,什么时候树化,讲解一下红黑树 * 2
      • 说下红黑树的特点?插入数据后是如何旋转的?
    • HashMap数据结构,红黑树退化
    • 说一下HashMap
    • *HashMap是线程安全的吗?如何解决不安全?说下concurrenthashmap的put过程
    • hashmap扩容是怎样的?为什么要保持2的n次方? - ?(整理下常见集合的扩容)
    • *解决hash冲突的方法有哪些?开放定址法的优缺点?如何理解线性增长? - ?
    • 如何遍历HashMap
    • Map和HashMap的区别 * 2
    • HashMap了解吗,讲讲put的原理
    • HashMap和LinkHashMap的原理
    • 口头描述HashMap的实现,包括哈希方法
    • equals方法和hashCode方法
  • ArrayList 和 LinkedList的区别,是否线程安全? * 5
  • BlockingQueue都有哪些?
  • 常用的数据结构哪些
  • 如何存不重复数据(答了用set存,问map不可以吗,答key不允许重复,重复插入会被覆盖,value值可以重复)

并发编程 * 32

  • 线程 * 20

    • 线程的状态有哪些 * 2

      • 六种状态,之间的相互转换,可引出:
        • Object的wait和UnSuport的park的区别
        • wait和sleep的区别?
        • 创建线程的方式有哪些?
    • 创建线程的方式有哪几种?* 3

      • Java线程实现介绍,可引出:
        • 线程池的创建方式有哪些?有什么区别
        • 线程池的参数有哪些?作用是什么?
        • SynchronousQueue?项目中用过哪些阻塞队列?引出集合相关
    • 关闭一个线程的方法是什么 - ?

    • 守护线程是什么 - ?

    • 怎样理解线程安全

    • *线程的同步方式了解吗- ? * 2

      • synchronized和AQS的原理、区别
        • 引出偏向锁、轻量级锁、重量级锁,锁膨胀过程
        • 锁的种类有哪些:按锁粒度(MySQL)、按加锁方式
        • *死锁,如何排查和解决
    • 线程、进程、协程的区别 - ?* 4

      • 为什么协程的性能好(Go)
    • *线程、进程的中断,这个过程是怎么样的? - ?

    • 说说sleep()方法和wait()方法区别,可引出

      • 线程状态
    • *常见的线程池有哪几种?如果线程池爆了会怎样? - ?

    • 线程池相关工具类介绍

    • 多线程开发过吗?通信方式有哪些?

    • 多线程的理解(多线程同步的途径)

    • 多进程(继承什么, 不继承什么),进程间的通信

  • 锁 * 5

    • Java有哪些锁,分别适用于哪些场景
    • synchronized:
      • 锁(synchronized 和 Lock),synchronized 加到普通方法和静态方法的区别,一个类的两个方法都加了 synchronized,是一个锁还是两个锁; - ?
      • synchronized的方法同步和代码块同步区别
      • 类加锁,static方法加锁是加锁什么对象
    • CAS:
      • ABA问题如何解决
  • 线程池: - ? * 2

    • 实现线程池,你觉得核心是什么
    • 线程池及参数,maximumSize 怎么达到;
  • 并发类 - ? * 4

    • ThreadLocal 用过吗?底层如何实现的?作用是什么?应用场景? * 2
    • 用过原子类吗?答AtomicInteger,问它的原理;
    • 说说volitile

JVM * 15

  • GC:* 5
    • Minor gc 和full gc
    • 堆内存的回收算法
    • Full GC场景
    • 说一下GC
    • GC机制
  • JVM调优
    • 有过调优经验吗
  • 类加载机制
    • 关于JVM 类加载器机制;
  • JMM * 7
    • 描述下Java内存模型
    • Java 内存分配
    • HotSpot 中的持久代指的是哪个分区?
    • 堆的分区
    • Java堆栈区别
    • 什么情况下 OutOfMemory(哪些区域会OOM?)
    • 内存泄漏问题
  • 对象从产生到消亡的过程(类加载、内存分配、对象创建、代码运行、GC(垃圾标识、垃圾回收)

Spring * 10

  • IOC * 3
    • 说一下IOC是用来干嘛的
    • IOC 原理
    • 讲一下IOC,Spring如何解决循环依赖问题
  • AOP * 4
    • 说一下AOP是用来干嘛的 * 2
      • AOP的使用场景即原理
    • JDK动态代理和CGLIB的区别 *2 - ?
      • jdk proxy 和cglib哪个快
  • Spring MVC的请求流程 - ? * 2
  • bean 生命周期? - ?

Go

  • gmp模型
  • gmp模型中阻塞发生时的底层

数据库 * 38

MySQL * 38

  • 存储引擎 * 4

    • InnoDB
    • mysql 引擎有几种,有什么最主要区别(底层结构的区别?) * 3
      • MyIsam、InnoDB的区别?
  • 存储结构 * 3

    • mysql用B+树而不是B树的原因
    • 讲讲MySQL的B+树
    • 存一张学生选课表应该用什么数据结构(位图) - ?
  • 事务 * 7

    • 隔离级别 * 4
    • 事务的四大特性(ACID)
    • *并发事务带来的问题 - ?
    • 解释下脏读、幻读产生的情况,MySQL如何解决幻读
  • 索引 * 12

    • 说一下mysql索引 * 2

    • 说一下MySQL的一二级索引(引出存储引擎,引出B+树)

      image-20220625163348076

    • 索引数据结构类型 * 4

      • 哈希索引
      • B+树索引 * 4
        • B+树索引说一下 * 2
        • 为什么用B+树而不是B树或红黑树?(他们之间的区别)
    • 索引的种类有哪些

    • 索引失效场景 * 3

    SELECT * FROM t_user WHERE group_id = 519000;
    SELECT * FROM t_user WHERE group_id < 519000;
    SELECT * FROM t_user WHERE group_id != 519000;
    SELECT group_id  FROM t_user WHERE group_id != 519000;
    SELECT * FROM t_user WHERE group_id = 519000 AND ctime > 1635351822;
    
    • mysql 行锁和列锁
  • 性能优化 * 7

    • 如何对mysql性能优化 * 4
      • 慢查询建索引,问怎么去分析,答explain
      • SQL如何优化?
      • 索引优化
      • 分表分库
    • 数据库写操作会有性能问题吗(答了行锁表锁)
    • 深度分页如何优化 - https://segmentfault.com/a/1190000023912355
    • 给一个数据库,数据很多,问从表结构怎么优化?
  • 安全

    • mysql如何防止注入(${}和#{}),安全性了解吗
  • 其他 * 4

    • 给个SQL语句说出它的执行顺序 Select sex,count(name) from test_tab where age>20 group by sex;
    • 给一个数据库设计,判断为第几范式,是否有优化的方法
    • 数据库日志介绍
      • 数据库undo log,redo log的介绍

中间件 * 30

Redis * 20

  • redis比mysql快的原因
  • redis了解吗
  • 获取所有string的方法?
  • 数据结构 * 6
    • redis支持的数据类型有哪些 * 3
    • redis 有什么数据结构,那set 和list 什么场景使用
    • redis用在哪里?用了哪种类型的数据结构(只有字符串。。) * 2
  • 应用场景
    • Redis 只用来做缓存?
  • 原理:* 6
    • Redis 中的key 有时间限制,你觉得他怎么实现的?如何设置过期时间? * 2
    • 持久化:Redis 持久化你会怎么做 * 2
    • redis哈希槽底层原理 - ?
    • redis新增节点,哈希槽变化 - ?
  • 高级 * 4

Kafka * 8

  • Kafka的原理
  • Kafka的controller选举 - ?
  • Kafka的副本机制
  • Kafka的零拷贝
  • Kafka的存储 - ?
  • Kafka为什么这么快 - ?
  • Kafka2.4之后的特性 - ?
  • kafka如何防止数据丢失?ack机制用过吗?

Nginx * 1

  • nginx怎么用的?

Zookeeper * 1

  • zookeeper用过吗?

分布式 * 1

  • 用过哪些分布式的东西

操作系统 * 9

Linux * 9

  • 配置环境变量

  • *IO模型 - * 4

    • NIO 知道吗?
    • IO多路复用epoll,是轮询的吗(引出Netty)
    • 五种IO模型
    • *socket的流程
  • 基本操作命令 * 2(常见的Linux的命令)

    • 查看线程
    • 排序命令(比如统计log日志内容)
  • 内存管理 - ?

    • 分页、分页保护、碎片
  • 对操作系统原理有什么了解

项目 * 23

  • JWT

    • 单点登录的实现
  • 项目介绍 * 2

  • *项目遇到什么难点?如何解决的(如何优化的) - ? * 3

  • 项目用到了什么技术栈? * 2

  • 场景题 * 10

    • 服务器被一个客户端的进程创建大量连接,怎么排查 - ?
    • 多读的场景是怎么优化的,感觉讲的不够好 - ?
      • 缓存:Redis
      • 数据结构:CopyOnWriteArrayList(读写锁)
      • 数据库:加索引
    • 并发场景解决方案 - ?
    • 云文档,共同协作输入内容,如何保证不冲突 - ?
    • 0 - 10亿元素插入(bitmap位图)
    • *top K * 2
      • RGB颜色存在一个文件中,取出出现频率前十数量的RGB颜色 - ?
      • 给定全国各地的城市以及各个城市的用户数量,利用spark统计下topk,说下具体思路 ?
    • 给一个六面骰子,如何做出一个1~10的等概率随机方法?
    • MySQL 查询前 100 条数据, 以及如何分组
    • 如何存不重复数据(答了用set存,问map不可以吗,答key不允许重复,重复插入会被覆盖,value值可以重复)
  • 部署环境 * 3

    • 项目怎么部署的
    • Docker 相关
    • CI / CD 发布流程 - ?
  • 开发环境 * 2

    • Git 相关
    • 开发环境(Windows、Linux)

其他 * 21

  • 自我介绍 * 5
  • 有什么想问我的吗 * 4
    • 反问 * 3
      • 什么时候出结果?一共几面?几天内会收到面试通知?
  • 谈人生
  • 聊一下个人的技术栈、个人优势
  • 二面项目展开
  • 最近在学习什么?
    • Go
    • Netty
  • 对WPS有了解吗
  • 将来的职业规划

HR * 6

  • 工作意愿
  • 是否拿到其他offer
  • 期望薪资,薪资体系 * 3
  • 介绍企业文化、介绍企业业绩

重点知识整理

My金山 ROOT

  1. Java
    1. 并发编程
      1. 线程
        1. synchronized、AQS
        2. 乐观锁、悲观锁
    2. 集合分类
      1. HashMap、ConcurrentHashMap
      2. ArrayList、LinkedList
    3. JVM
      1. JMM
      2. GC
    4. 面向对象
    5. 异常分类
  2. MySQL
    1. 索引
    2. 性能优化
    3. 事务
    4. 存储引擎
  3. 协议
    1. TCP
    2. Http
    3. Https
  4. 项目
    1. 项目难点
    2. 场景题
  5. 中间件
    1. Redis
      1. 数据结构
      2. 原理
    2. Kafka
      1. 特性
      2. 原理
      3. 应用
    3. Netty
      1. 特性
      2. IO模型
  6. 算法
    1. 排序算法
      1. 快排
      2. 堆排
    2. LRU
    3. DP算法
  7. Spring
    1. AOP
    2. IOC
  8. Linux
    1. IO模型
    2. 基本命令
  9. 设计模式
    1. 单例
    2. 工厂
  10. 其他
    1. 自我介绍
    2. 最近学习
      1. GO
      2. Netty
      3. 生活上在学习做饭
    3. 职业规划
    4. 个人优势
      1. 有分布式系统开发经验
      2. 有较好的沟通能力和一定团队管理经理
      3. 有自律的生活,经常反思总结