千篇面经梳理-新增题目(续:千题奉送)
新春开年,GoGoCoder祝大家新年快乐,续接上次元旦的千题奉送,这次给大家带来,2021-11.28-2022-01-02时间段,面经梳理的增补题目。
DataStructure
场景设计
- 10亿个QQ号如何存储访问最快?
- 假设搜索引擎的关键字a和b,对应存储文章ID的文档列表A,B,且列表A,B很长,问如何求a和b的交集
- 如何从大小为100万的数组中求TopK的数
- 如何设计负载均衡算法?
- 如何设计优先级队列
- 如何实现倒排文件
- 设计类和方法来定义一个寻宝游戏
- 位图稀疏如何优化
- 医院叫号场景:不管病人何时来都按照从小到大的顺序叫号
排序
- 堆排序的应用场景
- 堆排序时间复杂度分析
- 堆排序中二叉树不是数组,如何建堆
- 堆排序中建堆的时间复杂度分析
- 归并排序的时间复杂度分析
- 快速排序的应用场景
- 描述堆排序中建堆的过程
- 排序算法稳定性的作用
- 如何实现递归建堆
- 如何优化快速排序(快排)
- 手撕归并排序
- 手写堆排序
- 手写希尔排序
- 为什么堆用完全二叉树而不是平衡二叉树
树
- B+树如何范围查找
- B+树与红黑树的区别
- 二叉树的遍历方式
- 红黑树插入N个节点的时间复杂度
- 简述红黑树的插入删除操作
- 平衡二叉树删除操作的时间复杂度
- 完全二叉树的介绍
栈与队列
- 队列是如何遍历数据的,是否可以通过下标遍历
Java
JavaIO
- BIO和NIO均使用线程池对比分析
- epoll为什么可以提升效率
- IO流读取阻塞与非阻塞的区别
Java并发
- CAS和synchronized的区别
- Condition的底层实现
- CyclicBarrier的原理
- CyclicBarrier和CountDownLatch的区别
- execute和submit的区别
- Java并行流的原理
- Java线程的生命周期
- Java中的锁类型,区别以及锁升级
- reator模型简述
- synchronized是否能防止指令重排序
- 互斥与同步的关系
- 简述阻塞队列的工作流程
- 简述阻塞队列工作流程
- 解释什么是线程安全(线程安全究竟指的是?)
- 介绍Atomic原子类的相关知识
- 轻量级锁的实现原理
- 如何关闭线程池
- 如何释放锁,锁方法和锁对象有什么区别
- 线程池的提交优先级与执行优先级
- 线程池的最大生存时间的作用
- 线程池中CachedThreadPool参数的作用
- 线程池中keepAliveTime的作用
- 线程池中submit和excute的区别
- 线程加锁的方式有哪些
- 重量级锁的实现原理
Java服务器
- Docker工作原理与作用
- Niginx实现原理
- 如何进行服务器压力测试
- 如何实现负载均衡
Java基础
- CAP原则
- cloneable和serializable的区别
- comparator和comparable的区别
- findClass与loadClass的区别
- String是否是线程安全
- 创建类实例的方式(反射)
- 定义字符串和new一个字符串分别存在什么区域
- 继承父类可以重写对应的方法吗,什么情况不能重写
- 简述Java反射的应用场景
- 简述创建对象的几种方式
- 简述什么是依赖倒置
- 简要介绍java中常用的日志级别
- 类的实例化顺序
- 列出5个运行时异常
- 如果自己手动创建一个java.lang.String,这个类能否被类加载器加载
- 如何衡量接口的性能
- 如何进行代码优化
- 如何实现不可变类
- 是否能够继承多个父类
- 是否有两个对象有相同的hashcode
- 一个接口多个实现类,调用的时候怎么知道用哪一个
- 一个类可以实现多个接口吗
- 一个实现类继承多个父类,可直接调用父类的方法吗
- 重写方法用到什么注解
Java框架
- AOP的应用场景
- Async注解的作用
- Dubblo的工作原理
- ElasticSearch的索引结构
- ElasticSearch集群如何调优
- MapReduce的工作原理
- MybatisResultMap和ResultType区别
- Mybatis相比原生jdbc的优点
- Nacos的原理
- netty的内存管理是怎么做的
- OAuth2.0的原理
- Rpc的底层原理
- Shiro框架的作用与应用场景
- SpringBoot如何自动切换日志级别
- SpringCloud常用哪些注解?
- Spring的scope的类型
- Spring的三大思想
- 对Spring的理解
- 简述Dubbo
- 简述SpringBoot的优点
- 简述SpringSecurity的作用
- 利用redis和Springcache设计查询缓存
- 为什么用netty而不直接使用nio
Java容器
- ConcurrentHashMap1.8为什么放弃分段锁
- ConcurrentHashMap的执行get方***不会加锁
- hashmap初始化长度是多大,可以规定长度吗,怎么计算初始化容量
- HashSet和HashMap的区别
- HashSet如何查找一个元素
- HashSet如何判断一个元素是否在Set
- Java各种Map的遍历效率对比
- TreeMap查询写入等操作时间复杂度分析
- 哈希表的装填因子如何设定
- 如何保证key唯一
- 如何使HashMap变为线程安全的集合
Java虚拟机
- CMS垃圾回收使用得回收算法
- CMS算法的优缺点
- GC的整体过程
- jdk8使用哪种垃圾回收器
- jvm信息通过哪些命令查看
- jvm怎么设置栈大小
- JVM中线程私有公有的区域
- OOM和栈溢出的区别
- 标记清除算法如何给对象分配内存空间
- 程序计数器的作用
- 调用函数时内存中堆和栈如何变化
- 堆中存放的内容
- 对常量池的理解
- 对象头有哪些内容
- 基本数据类型存在哪里
- 局部变量表存在哪里
- 元空间大小是否有限制
- 栈溢出抛什么异常
分布式
- CAP原则
- Paxos分布式一致性算法
- Raft分布式一致算法
- zookeeper注册流程
设计模式
- 如何进行权限控制的设计
- 软件开发应具备的特性
- 有哪些灵活的治理手段可以应对下游的异常?
- 状态机设计模式
MQ
Kafka
- kafa如何确保消息不被重复消费
- kafka的offset存在哪里
- kafka的rebalance的触发条件与过程
- kafka的零拷贝技术
- kafka的使用场景和作用
- kafka高性能高吞吐量的原因
- kafka如何保证消息不丢失
- kafka如何保证有序(写入有序、消费有序)
- kafka如何找到某条消息?
- kafka是推模式还是拉模式
- kafka消费组概念
- kafka一个partition对应多少个消费者,一个消费者对应多少个partition
MQ可靠性
- kafka如何保证数据可靠性
- MQ使用场景
- MQ使用场景
- RabbitMQ使用效率
- 插入延时队列过期时间是否单调
- 延时队列动态时长控制
MQ消息模型
- RabbitMQ的工作模式与作用
- RabbitMQ如何确保不重复消费
- RabbitMQ消息存储结构
- RabbitMQ延时队列底层实现
- Rabbit如何保证可靠性
- 消息队列的本质作用
Mysql
Mysql复制
- 简述Mysql同步数据机制
Mysql基础
- having和where的区别
- Orderby和Groupby的执行顺序
- 每行2Kb的数据,共计1千万行,需要从磁盘读多少次
- 数据库引擎的作用
- 数据库中删除数据,保留表结构的命令
- 主键与外键的区别
Mysql事务
- CAP理论
- Mysql事务及特性
- 分布式事务如何解决
- 简述事务的四个特性,并给出实现事务的方式
Mysql索引
- Mysql的默认索引
- Mysql索引数据结构
- 索引的实现原理与作用
- 索引树的高度及计算方法
- 主键的优点与缺点
- 主键索引与普通索引的区别
Mysql锁机制
- Mysql三级封锁协议
- 间隙锁,记录锁与临间锁的区别
Mysql问题与解决方案
- Mysql单表数据量过大会有啥问题?为什么数据量不能过大
查询性能优化
- leftjoin与rightjoin区别
分库分表
- 分库分表什么时候水平拆分,什么时候垂直拆分
Network
Http相关
- Http、Https性能比较
- http2.0引入多路复用的目的
- Https的TLS的工作原理
- https的证书简述
- https建立连接的过程
- Https如何断定恶意网址
- Http报文格式
- HTTP的get方法如何判断数据传输完毕
- Http建立连接的过程
- Http是基于Tcp还是Udp?
- Http与Tcp的关系与区别
- Web服务器是如何解析HTTP请求报文
- 简述HTTP的工作机制
- 简述什么是HTTP?
- 立足于http协议解释,为何第二次从网页上下载图片会变快
- 全双工通信和半双工通信的差别
Network框架相关
- Dubbo如何实现一致性哈希
- Dubbo远程调用的实现原理
- Nginx的作用与优缺点
- Nginx负载均衡的实现原理
- RPC服务注销需考虑问题
- RPC框架的工作流程
- RPC框架的应用场景
- RPC框架如何实现监控上报
- RPC如何进行路由寻址
- RPC如何实现服务注册与发现
- RPC如何实现请求解析映射
- RPC实现的基本原理
- 服务节点不稳定,如何避免调用该节点
- 如何处理服务不能调用的情况
- 如何定义一个RPC服务
- 限流和熔断分别适用于哪些场景
Socket相关
- Socket建立连接时的工作流程
- Socket通信与Tcp通信的比较
- 下载文件时下载速度为什么会先上升再平滑?
传输层
- A、B间有TCP连接,如果B拔网线,TCP连接会怎样
- TCP报文中的端口号是如何获取的
- TCP的报文格式
- TCP的连接状态有哪些
- Tcp的慢启动
- TCP的特点
- TCP的延迟主要在哪
- TCP和socket的区别
- TCP建立连接需要的系统调用
- TCP如何控制建立连接与断开连接
- Tcp如何判断连接超时?
- TCP协议报文格式
- TCP协议的简要介绍
- 当服务器与客户端建立连接后,服务器端突然断电,客户端会怎样?
- 服务器存在大量的close-wait状态如何处理
- 快重传与快恢复的区别
- 列举使用TCP协议的应用/场景
- 三次握手中出现丢包现象如何处理
- 什么是连接半打开状态
网络层
- 简要介绍OSPF协议
- 简要介绍RIP协议
- 路由转发方式
- 网络体系结构
- 静态资源如何加速
- 静态资源与动态资源的区别
- 如何预防XSS攻击
- 网络中信息传递的顺序(同网段、不同网段)
- 为什么要动静分离
应用层
- Cookie中包含哪些内容
- CSRF的防御措施
- DNS使用TCP协议还是UDP协议
- 浏览器内核的组成
- 浏览器如何获取HTML文件并渲染
OS
Linux命令
- grep命令的原理
- Linux的常用命令
- Linux如何查看机器负载
- Linux如何查看内存状态
- 查看socket状态的命令
- 查询进程号
- 查询一个文件有多少行
- 文件操作的常用命令
- 修改文件后缀名的批量命令
OS基础
- 32位机器与64机器的区别
- BIOS负责什么工作
- cpu基本结构
- CPU如何区分数据和地址
- Linux系统的启动过程
- 简述PC电源启动后的开机过程
- 简述数据编码的实现及其作用
- 开发新编程语言的意义
- 如何保证OS的实时性
- 微内核与宏内核的区别
- 为什么会发生指令重排
- 自旋锁和读写锁是否会引起用户态到内核态的转移
OS锁机制
- 多线程互斥锁/读写锁/自旋锁的区别
- 简述银行家算法
- 简要介绍无锁编程的原理
- 如何进行死锁预防
- 如何判断发生死锁还是死循环
进程管理
- 创建进程与创建线程的区别
- 读进程过多导致写进程饥饿如何处理
- 多核系统中多线程与多进程如何选择
- 多进程与多线程的区别
- 介绍时间片轮转调度算法
- 进程如果发生内存泄露,进程退出后,还会泄露吗?
- 进程在接到kill指令之后的处理流程
- 内核如何通知并唤醒已经阻塞的用户态进程
- 缺页中断会对进程造成什么影响,是否会影响系统中别的进程
- 缺页中断如果影响一个进程下的某个线程,是否会对别的线程有影响
- 线程独有的数据结构
- 线程间如何进行数据共享
- 用户态的进程之间会用哪种IPC方式
- 子进程会继承父进程哪些信息
内存管理
- cache与交换区的区别
- cpu六种调度算法
- mmap和read的区别,优缺点
- 操作系统逻辑地址的作用
- 操作系统如何管理内存资源?
- 段页式设计的原理与优点
- 简述什么是内存屏障
- 零拷贝原理
- 内存分配算法
- 内存屏障的实现原理与应用
- 内存泄漏与内存溢出的区别
- 为何磁盘顺序读写比内存读写性能高
- 虚拟地址获取物理地址过程,失败如何处理
- 虚拟内存及其作用介绍
- 虚拟内存与物理内存的区别
- 页缓存机制
设备管理
- 简述DMA原理
- 外设的驱动程序运行在用户态还是内核态
设计与应用
- A向B转账的同时B向A转账,如何避免死锁?
- 集群中多台机器如何保证ID互异
- 如何找到10亿个数据中第二大的数?
- 系统如何容灾?
文件管理
- Fd通过哪种数据结构串联
- Linux中Shell和应用程序同时获取某目录下信息,会发生哪些问题
- 读文件的系统调用
- 简要介绍文件系统脏页
- 如何保证文件close后写成功
- 如何避免脏页
- 如何进行fd的读取
- 文件操作符的作用
- 修改文件需要的系统调用
Redis
Redis部署架构
- rediscluster对于哪些命令不支持
- rediscluster集群模式架构
Redis使用场景
- 简述Redis使用场景
Redis数据结构
- 跳表的时间复杂度分析
- Redis数据类型
- Redis基本数据类型
Redis特性
- Redis4.0和6.0的变化趋势
- Redis哈希表如何rehash
- Redis内存管理机制
- Redis虚拟内存机制
Redis问题与解决方案
- Redis的Sharding有哪些做法
- redis和mysql的区别
- Redis如何进行容灾
- 分布式锁中看门狗的概念
- 过期与淘汰策略
- Redis的近似LRU详细解释
Test
软件测试基础
- 测试的策略有哪些
- 单元测试的策略有哪些
- 对测试框架的了解
- 简述一下缺陷的生命周期
- 阶段评审与项目评审的区别
- 描述测试用例设计的完整过程
- 如何模拟弱网测试
- 如何排查bug
- 软件的安全性应如何测试
- 软件缺陷记录包含哪些内容
- 什么是兼容性测试
- 什么是驱动模块
- 什么是系统瓶颈
- 什么是桩模块
- 现在有一支笔,说说如何对其进行测试?
- 一套完整的测试应该有哪些阶段组成
- 引入测试管理的含义
- 自动化测试软件
目前,后端面经真题频度汇总,已涵盖217家公司的917多篇后端面经,题目频度统计达8713条,涵盖Java、数据结构、操作系统、计算机网络、数据库、Redis、MQ、软件测试等多个科目。同时,我们将梳理出来的题目,按照面试题目频度排好序,分享给大家,让你无需扒面经,就能全盘掌握面试考点,赢在面试准备的起跑线上。
欢迎大家关注我的公众号GoGoCoder、GitHub:GoGoCoder、检索工具: http://gogocoder.com