BAT大厂面试的100道考题【算法、源码、架构、中间件、设计模式、网络、项目】,过60分的不到10%

作者:小傅哥
博客:https://bugstack.cn

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


独生子女生娃,没救了!

小傅哥,你的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

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

  • 选项
    • A.O(1)
    • B.O(n)
    • C.O(logn)
    • D.O(n^2)
  • 答案:B
  • 解析:链表的操作只有插入的时间复杂度是O(1),其他操作时间复杂度都O(n)。也因为有这样的情况,所以开始设计出二叉搜索树、AVL平衡树、红黑树等数据结构。让时间复杂度尽可能平衡到O(logn)。
  • 详细https://bugstack.cn/md/algorithm/data-structures/2022-07-22-linked-list.html

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:缓存的作用范围

  • 选项
    • A.一级缓存作用于 SqlSession
    • B.一级缓存作用于 namespace
    • C.二级缓存作用于 namespace
    • D.二级缓存作用于 All 全局查询
  • 答案:A、C
  • 解析:一级缓存是作用在 SqlSession 会话层面的,一次会话结束(commit、rollback、close)后缓存就结束了。而二级缓存则是作用到 namespace 范围,通过装饰一级缓存,把数据保存到队列中进行使用。那么你知道这是一种什么队列吗?为什么二级缓存并不常用?
  • 详细https://bugstack.cn/md/spring/develop-mybatis/2022-07-05-%E7%AC%AC19%E7%AB%A0%EF%BC%9A%E4%BA%8C%E7%BA%A7%E7%BC%93%E5%AD%98.html

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

7. 中间件(61~70)

01:中间件分为哪些类

  • 选项
    • A.终端仿真/屏幕转换中间件
    • B.数据访问中间件
    • C.远程过程调用中间件
    • D.消息中间件
    • E.交易中间件
    • F.对象中间件
  • 答案:A、B、C、D、E、F
  • 解析:中间件的分类有很多中,这可能也是让大家在平常的开发中迷惑,到底哪些是中间件。一些基本的中间件定义很好定位,比如MQ、RPC、Dapper等等,但有些软件服务虽然不是作为中间件开发出来的,但它们如果符合中间件的定义,也可以归纳到中间的范畴里。
  • 详细https://bugstack.cn/md/assembly/middleware/%E7%AC%AC%201%20%E7%AB%A0%20%E4%BB%80%E4%B9%88%E6%98%AF%E4%B8%AD%E9%97%B4%E4%BB%B6.html

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/

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

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

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

05:Netty 和 Tomcat 的区别?

06:半包粘包协议的使用

07:Netty 流量整形处理类

08:Netty 使用 SSL 通信的作用

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

  • 选项
    • A.定义通信一些包,含有针头和标记位
    • B.自定义继承实现 ByteToMessageDecoder 拦截标记指令
    • C.通过指令获取对应解析序列化操作
    • D.每个对应的消息处理器实现类 SimpleChannelInboundHandler 接收指定协议消息
  • 答案:A、B、C、D
  • 解析:一般对于 IM 通信的实现中,是需要自定义一组通信协议的,协议中要包括帧头、帧尾、标识符、长度等信息,来方便你完成半包粘包以及不同协议的处理。
  • 详细https://bugstack.cn/md/project/im/2.2%EF%BC%9A%E9%80%9A%E4%BF%A1%E5%8D%8F%E8%AE%AE%E5%8C%85%E5%AE%9A%E4%B9%89.html

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

03:商品秒杀独占竞态锁

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

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

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

06:A/BTest 用途

07:MySQL 应用连接数配置

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

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

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

  • 选项
    • A.通过编写联合查询多库的SQL
    • B.从每个库表查询到内存中汇总
    • C.通过binlog同步到ES,从ES查询
    • D.以上都可以
  • 答案:C
  • 解析:通常在分布式服务中会使用分库分表承担较大的数据体量,但给C端的查询,基本不会使用复杂的 SQL 查询,更不会关联多个库表,这样会拖垮数据库。基本合理的方式是C端查询在有路由字段的时候都是查指定库表,直接提供返回即可。而如果是汇总类查询则需要基于 binlog 把分库分表数据同步到 ES 查询使用。
  • 详细https://bugstack.cn/md/project/lottery/Part-5/%E7%AC%AC07%E8%8A%82%EF%BC%9A%E9%83%A8%E7%BD%B2%E7%8E%AF%E5%A2%83%20Elasticsearch%E3%80%81Kibana.html

10. 扩展问题(91~100)

01:常用的绘图工具

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

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

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

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

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

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章