# 考试:能力测评

作者:小傅哥
博客:https://bugstack.cn (opens new window)

沉淀、分享、成长,让自己和他人都能有所收获!😄

# 一、前言:什么是面试?

你的技术广度在哪?你的技术深度在哪?

面试本身就一场对你能力质疑的过程,面试官必须通过考题来验证你的能力是否真实。正式因为我对你不了解,所以我要通过一些提问来得到我心里对你的评分

如果你把面试当成是一场造火箭的演示,那也无可厚非。虽然最终可能你仍旧是80%的CRUD搬砖工,但就像没有桥墩和护栏的跨江大桥,也是没有几个人能敢上去走,即使平常我们都不是把着护栏过桥。这就像企业招聘员工,我要的就是考察出你的边界在哪,你应对风险的能力有多强。

好,这就是面试的目的!那么接下来,小傅哥也帮助你做一次技术能力检验考试。在100道题,考试中,看看你属于哪个范围;在校实习生初级工程师中级工程师高级工程师还是有大厂架构师的潜力。加油 💪🏻

# 二、考试:准备好了吗?

  • 试卷名称《Java 工程师 100 道考题 v1.0》 (opens new window) —— 扫描二维码答题或阅读公众号原文答题
  • 出题范围:这是一套根据小傅哥博客【bugstack.cn (opens new window)】归纳出来的考试题目,用于小伙伴自己的学习成果检查。
  • 考题范围:数据结构、算法、源码、设计模式、系统架构、中间件、网络通信、实战项目、扩展问题
  • 等级评估
    • 在校实习生:00分-30分
    • 初级工程师:30分-60分
    • 中级工程师:60分-70分
    • 高级工程师:70分-80分
    • 大厂架构师:80分+

# 三、查看:你的总排名!

考完了吗,快来查看下你的总分排行吧(动态更新Ing) —— 80分以上的小伙伴,可以找小傅哥内推!

# 四、解析:考题知识点

独生子女生娃,没救了!

小傅哥,你的100道Java考题,我只考了16分,是不是没救了!给我个答案吧!那么鉴于不少小伙伴已经考完了,那么小傅哥就做一个考题解析,方便读者可以针对自己的问题进行补充学习。

其实这些考题只是相当于在你的技术栈地图中,拎出100个检查站点,进行片段化的提问,来检查你对知识网的覆盖程度。而学习的最终目标远不是来背这些题,那样是没有多大的意义的,否则你在面对面试官时换个方向再问,可能你还是没法回答。所以更有意义的事是慢下来,不贪多,一步一个脚印的用自己的思考和实践验证学会这些内容。

好啦,小傅哥就做个这些问题的分析,如果你还没有参与考试也可以先尝试考一下,再看解答会更有感觉。

# 1. 算法(1~10)

# 01:常见的数据结构有哪些

# 02:优先队列是基于什么数据结构实现?

# 03:HashMap 解决哈希碰撞的数据结构?

# 04:ArrayDeque 实现堆扩容时需要进行几次元素拷贝?

# 05:基于数组实现的二叉堆,元素k如何计算父节点

  • 选项
    • A.k >> 1
    • B.(k + 1) << 1
    • C.(k - 1) <<< 1
    • D.(k - 1) >>> 1
  • 答案:D
  • 解析:基于数组实现的二叉堆所有子节点与父节点的位置关系,是子节点除以2取整,就是父节点的位置。之所以是这样的一个计算关系,因为它整个二叉堆上每一层元素在数组位置的存放上,就是一个1、2、4、8码的结构,也就是二进制结构。所以可以除以2取整计算父节点位置。那么使用二进制计算就是 (k - 1) >>> 1
  • 详细https://bugstack.cn/md/algorithm/data-structures/2022-09-03-heap.html (opens new window)

# 06:链表删除任意元素的时间复杂度

# 07:HashMap 负载因子的使用

# 08:ThreadLocal 解决哈希碰撞的散列算法?

# 09:HashMap 链表转红黑树条件

# 10:关于 ArrayList 和 LinkedList 插入1000万个元素性能对比

# 2. 源码-Java(11~20)

# 01:JDK创建代理的方式

# 02:volatile 关键字的作用

# 03:Integer.toHexString("".hashCode()) 输出结果?

# 04:哪些是公平锁实现方式?

# 05:Synchronized 和 ReentrantLock 的描述

# 06:Thread.start()的启动过程包括?

# 07:Thread 线程状态包括?

# 08:线程池拒绝策略包括?

# 09:JDK 常用命令叙述错误的是?

# 10:JVM 虚拟机运行时数据区包括?

# 3. 源码-Spring(21~30)

# 01:Bean 对象容器使用的是?

# 02:InstantiationStrategy Bean 对象的实例化策略有哪些?

# 03:资源解析的类型包括

# 04:BeanPostProcessor 与 BeanFactoryPostProcessor 的作用范围

# 05:向虚拟机注册钩子的作用?

# 06:Aware 感知接口的实现类包括?

# 07:FactoryBean 和 BeanFacory 的用途

# 08:如何实现一个容器事件

# 09:AOP 切面如何拦截方法

# 10:哪一级存缓存放代理对象

# 4. 源码-MyBatis(31~40)

# 01:MapperProxy 的作用是什么?

# 02:解析的SQL语句存放到哪里?

# 03:池化数据源的目的是什么?

# 04:Executor 执行器提供哪些方法

# 05:MyBatis 框架中值的设置

# 06:参数的处理和结果集的封装,用到了什么设计模式

# 07:#{}与${}的区别是什么?

# 08:Insert 返回自增索引

# 09:Plugin 插件功能作用范围

# 10:缓存的作用范围

# 5. 设计模式(41~50)

# 01:设计模式分类

# 02:设计模式原则包括

# 03:多支付渠道与多支付方式,建议使用哪种设计模式

# 04:MyBatis 二级缓存对一级缓存的上层实现,使用的什么设计模式

# 05:规则树人群过滤,建议使用什么设计模式实现

# 06:不太常用的设计模式组合

# 07:模板模式的重点

# 08:建立起 MyBatis 和 Spring 的连接

# 09:各类优惠券;直减、满减、免息等包装使用,需要什么设计模式

# 10:单例模式实现方式包括

# 6. 系统架构(51~60)

# 01:创建工程框架包括

# 02:引入Dubbo到框架中,为什么需要单独分出RPC的模块层

# 03:分布式框架技术栈包括

# 04:DDD领域服务包括什么

# 05:低代码能解决什么场景问题

# 06:Zachman框架的六个观点

# 07:中台设计通常分为

# 08:中台的实现难度主要包括

# 09:非入侵的系统监控设计需要哪些技术栈

# 10:软件设计原则康威定律包括

  • 选项
    • A.组织沟通方式会通过系统设计表达出来
    • B.时间再多一件事情也不可能做的完美,但总有时间做完一件事情
    • C.线型系统和线型组织架构间有潜在的异质同态特性
    • D.大的系统组织总是比小系统更倾向于分解
  • 答案:A、B、C、D
  • 解析:康威定律 (康威法则 , Conway's Law) 是马尔文·康威1967年提出的:"设计系统的架构受制于产生这些设计的组织的沟通结构。"
  • 详细https://zh.m.wikipedia.org/zh-hans/%E5%BA%B7%E5%A8%81%E5%AE%9A%E5%BE%8B (opens new window)

# 7. 中间件(61~70)

# 01:中间件分为哪些类

# 02:非业务逻辑的共性服务功能

# 03:SpringBoot Starter 如何加载自定义配置(resources/META-INF/spring.factories)

# 04:ES 查询方式

# 05:Dubbo 通信方式

# 06:数据库路由分库分表散列算法

# 07:分布式任务调度实现技术

# 08:字节码增强的框架

# 09:RPC-Dubbo 泛化调用的使用场景

# 10:IEDA Plugin 开发完成后如何提交到市场

# 8. 网络通信(71~80)

# 01:NIO 通信模式

# 02:Netty 的优势有哪些?

  • 选项
    • A.使用简单:封装了 NIO 的很多细节,使用更简单。
    • B.功能强大:预置了多种编解码功能,支持多种主流协议。
    • C.性能高:通过与其他业界主流的 NIO 框架对比,Netty 的综合性能最优。
    • D.稳定性好:Netty 修复了已经发现的所有 NIO 的 bug,让开发人员可以专注于业务本身。
  • 答案:A、B、C、D
  • 解析:Netty 官网描述其特点;使用方便、效率高、安全的介绍。这也是大家都喜欢使用 Netty 的原因。
  • 详细https://netty.io/ (opens new window)

# 03:Netty 的应用场景有哪些?

# 04:Netty 高性能表现在哪些方面?

  • 选项
    • A.多线程Reactor反应器模式
    • B.内存零拷贝
    • C.内存池设计
    • D.对象池设计
  • 答案:A、B、C、D
  • 解析:Netty 的设计表现为;更高的吞吐量,更低的延迟、更少的资源消耗、最小化不必要的内存拷贝。
  • 详细https://netty.io/ (opens new window)

# 05:Netty 和 Tomcat 的区别?

# 06:半包粘包协议的使用

# 07:Netty 流量整形处理类

# 08:Netty 使用 SSL 通信的作用

# 09:IM 通信;登录、验证、文件、表情、消息多协议处理

# 10:Netty ChunkedStream 数据流切块传输的目的

# 9. 实战项目(81~90)

# 01:分布式下保证幂等性实现

# 02:什么情况下分库分表

  • 选项
    • A.TPS、QPS、GMV、PV、UV等数据指标,增速较快
    • B.数据增量很大,数据库连接数扩容不能满足
    • C.存量数据较大,热数据不多
    • D.单体应用承载了过多的业务诉求,业务又增量加快
  • 答案:A、B、D
  • 解析:对于存量数据较大,但热数据访问不多的情况下,大部分是通过迁移来解决,而不是引入分库分表提高系统的开发成本来处理。
  • 详细https://bugstack.cn/md/zsxq/material/interview.html (opens new window)

# 03:商品秒杀独占竞态锁

# 04:抽奖概率 0.0000001 很小如何设计

  • 选项
    • A.采用 Redis 存放一个对应概率码
    • B.建立一个超大的 HashMap 存放
    • C.通过双色球设计,每个为数是一组数字的组合
    • D.与运营沟通,调整方案
  • 答案:A、C、D
  • 解析:对于抽奖系统有时候运营会需要一些极小的概率的奖品,保持有但基本中不了。对于这样的情况实现方式还是蛮多的,比如开奖多少次后才投放,或者就是提供概率。而概率又太大,所以要进行一些设计比如 Redis 提供一个对应的概率码,或者双色球每一个位置又是N种组合。但不太合适建一个重大的 HashMap 来存放。
  • 详细https://bugstack.cn/md/zsxq/material/interview.html (opens new window)

# 05:多种类型抽奖策略如何注册

# 06:A/BTest 用途

# 07:MySQL 应用连接数配置

# 08:高并发下提供给前端H5分页

# 09:项目运行较慢,重启后就好了

# 10:分库分表数据如何汇总查询(给C端用户使用)

# 10. 扩展问题(91~100)

# 01:常用的绘图工具

  • 选项
    • A.xmind
    • B.visio
    • C.draw.io
    • D.Workbench
  • 答案:A、B、C、D
  • 解析:xmind、visio、draw.io、workbench
  • 详细:https://bugstack.cn/md/other/guide-to-reading.html (opens new window)

# 02:常用的开发工具

  • 选项
    • A.IntelliJ IDEA
    • B.Navicat
    • C.Docker
    • D.JD-GUI
    • E.RDM
    • F.Postman
  • 答案:A、B、C、D、E、F
  • 解析:常用工具系列;IntelliJ IDEAJ、Navicat、Docker、JD-GUI、RDM、Postman
  • 详细:https://bugstack.cn/md/other/guide-to-reading.html (opens new window)

# 03:UML 类图,实现的画法

# 04:树上10只鸟开一枪还剩下几只,你会想到什么?

# 05:想把代码写好,都要包括哪些东西

# 06:如何保证需求如期交付?

  • 选项
    • A.从产品的BRD到PRD阶段开始确定预期上线时间
    • B.产品、UI设计、测试、研发、交付、预发、上线等时间线规划
    • C.每天一个固定时间开项目进度敏捷站会,对其进度,评估风险
    • D.如果是突然加需求,调整PRD等,那么需要重新进行资源协调。
  • 答案:A、B、C、D
  • 解析:为了保证项目的如期交付和交付质量,互联网中会从产品的BRD、PRD、研发设计、开发、测试等各个环节进行把控。
  • 详细https://bugstack.cn/md/zsxq/material/architecture_design.html (opens new window)

# 07:什么是并发,什么是并行?

  • 选项
    • A.并发:是指如何正确、高校地控制共享资源;
    • B.并行:是指如何利用更多的资源来产生高快速的响应;
    • C.并行:是指如何正确、高校地控制共享资源;
    • D.并发:是指如何利用更多的资源来产生高快速的响应;
  • 答案:A、B
  • 解析:其实有一大部分研发人员,搞不懂什么是并发编程,甚至常把并发编程和分布式联系起来。但很多的分布式架构设计,并不是在压榨一台机器的性能做IO密集型运算,所以如;并发、并行、多任务、多进程、多线程、分布式系统等,很多术语在大量的编程资料中被滥用了。
  • 详细https://bugstack.cn/md/about/study/2022-06-19-OnJava.html#%E5%9B%9B%E3%80%81%E6%B7%B1%E5%BA%A6-%E9%80%8F%E6%9E%90%E5%8E%9F%E7%90%86 (opens new window)

# 08:你觉得怎样编码更合理

# 09:你觉得我们的面试为什么像造火箭?

# 10:关于小傅哥