Java笔试题考点梳理

1. 笔试题目选择

关于笔试题的选择,有很多种方式。无论怎么选择,一定要问自己:这个题是否可以把候选人的动手能力体现一二?是否和本岗位的实际研发技能需求贴近?


我了解到,有的面试官经常从公共题库选题,有的面试官从个人题库选题,有的面试官从网上选题,有的面试官长你只用同一道题。无论哪里的题,其实核心是:具体延伸、深挖的考察点,这样可以通过互动提问过程,或者说代码review 交互过程,评估出候选人的动手、思考、交流等软硬件能力


2. 笔试题考察点

1. 需求理解

有的笔试题,非常抽象,然后给一个简单例子。有的笔试题,非常具体,考察的点非常明确。例如案例1: 有N个队列,每个队列有M个数字,求所有队列都出现的数字。例如案例2,求A 和B 字符串的共同出现的最长子串。


一些候选人,上来就开始写代码。这不是最佳的“姿势“。应该先进行需求对齐,需要主动向面试官提问。例如案例1,队列的数字是否有序,队列的数字是否重复,队列的数字类型是否统一等。例如案例2,是直接使用lib,还是自己实现,对时间复杂度有什么要求。


加分点:主动需求沟通、需求对其。这个反应的是工作中,是否“习惯性“对需求发起对齐、确认的”意识“


2. 最佳和最快

有的候选人敲代码前很纠结,这个题是最快、最笨的方法实现,还是弄一个最佳的、需要仔细设计的实现?例如案例1,直接暴力的 for、hash等实现,还是排序队列求交实现?


推荐:先已自己最擅长的方式,或者说最笨的方式,快速实现一个版本。然后在与面试官,讲解代码过程中,提出其他的实现方案,需要“讲“清楚关键数据结构、关机处理逻辑。


3. Code Review

这部分最为关键,尽是细节点。也正是这些“细节”点,反应候选人在写代码过程中的点滴思考和过往经验的“折射”。

一般的考察点如下

1. 可读性、可运维性

体现的点:(1)函数、方法、参数的命名(2)主线逻辑、局部实现逻辑的 “组合“编排 (3)For 循环的深度、If else的 简化、Case switch的简化 (4)基本的注释说明 (5)程序异常了,如何排查定位问题


提问:

  1. 命名有什么好的经验和选择
  2. 函数的行数一般多长比较合适,为什么
  3. 添加新的逻辑,在这段代码哪里改,成本最小
  4. If else 是否可以精简
  5. for 循环是否可以 提前退出
  6. for、do while、while 有什么区别,使用的注意事项是什么
  7. 注释怎么写比较好?为什么。例如中文注释有什么不足点?
  8. 有没有GVM 调参的经验
  9. 程序异常崩溃了,如何排查,一般使用哪些工具排查
  10. 平时代码部署的服务器有多少台,有没有遇到部署过程中的异常问题,如何排查和解决
  11. 业务是否出问题怎么识别、怎么定位、怎么解决

。。。


2. 健壮性、基本质量

体现的点:(1)入参数的校验(2)边界条件的处理(3)循环的退出条件 (4)IO资源的关闭(5)日志的输出 (6)单侧的用例覆盖

提问:

  1. 当前的实现,支持哪些场景、不支持哪些场景的输入
  2. 边界条件是什么,为什么这么处理
  3. 循环是否有提前退出的可能,是什么时候
  4. IO资源关闭,是否存在极端情况的泄漏
  5. Sytem.out 和 log 输出的差别是什么?什么时候使用system、log
  6. 代码质量的保障措施有哪些?
  7. 常见的测试方法有哪些,你平时使用那种方法,有什么优点、不足
  8. 如果运行过程中,突然断电了会有什么问题发生
  9. 如何改造,可以在服务器异常下,业务不受影响
  10. 大型项目,很多同学同时研发,如何保障整体的质量
  11. Map、HashMap、List、ArrayList、Filter等基础数据结构原理和实现

。。。


3. 复用性、移植性

体现的点:(1)逻辑处理的场景鉴容性 (2)方法抽象定义的内聚、功能单一性 (3)无状态化,减少全局变量的依赖 (4)简单数据结构


提问:

  1. 具体代码考虑的场景是否充分,例如还其他的输入的影响?
  2. 结合这个笔试题,用面向对象的概念分析、介绍下?
  3. 服务器异常,快速从另外一个服务器拉起应用,当前实现是否可行,有什么需要改造的
  4. 复杂均衡怎么实现
  5. 限流降级怎么实现
  6. 切面是否有帮助
  7. 配置中心是否有帮助,为什么
  8. 是否可以跑在云端,如何改造
  9. 做为公共Tool 类,还需要做哪些改造
  10. 你觉得企业内部代码是否应该全员开放,为什么
  11. Java、GO、C++、Python等语言的差异是什么,你喜欢哪种语言,为什么

。。。


3. 复杂度优化

体现的点:(1)算法本身的复杂度 (2)分布式实现方案 (3)其他的组合算法实现

提问:

  1. for循环可否去掉,为什么
  2. 是否有分布式的实现方案
  3. 是否可以多算法组合进行优化,怎么做
  4. 如何控制软件的复杂度?
  5. 重构是怎么理解的,什么时候需要重构?重构需要避免哪些坑
  6. 架构设计有什么作用,架构设计和复杂度优化是否有关系,如何通过架构设计降低复杂度
  7. 复用第三方jar 和自己实现,有什么异同,需要注意什么

。。。


4. 性能优化

体现的点:(1)内存优化 (2)IO优化 (3)网络优化 (4)多线程优化(5)分布式版本实现 (6)GC友好优化 (7)Cache 优化 (8)任务拆分


提问:

  1. 输入参数非常大,内存装不下,怎么优化
  2. 频繁的内存、磁盘交换,有什么问题,如何优化
  3. 多线程原理,本题多线程是否可以实现,如何实现
  4. 单机并行、分布式并行实现的方案是什么
  5. 当前算法实现,是否可以直接分布式部署使用,需要怎么改造,可以实现分布式版本
  6. 当前代码实现,哪些地方可以优化,可以对GC回收友好
  7. Java GC的原理、常用回收算法
  8. 其他性能优化,例如cache引入
  9. 平时了解和使用的cache 算法有哪些,优缺点是什么
  10. 大型项目,研发如何分工合作
  11. 当前的实现方法是否可以进一拆解?
  12. 大任务和小任务,例如大sql 和多个小sql 并行执行,那个更好,为什么?
  13. 同步和异步的区别是什么
  14. 消息引入进来,是否有帮助,为什么
  15. 使用mysql 为何不使用nosql
  16. 使用其他存储是否有帮助,例如es 为什么有帮助?


。。。





上一篇:为什么说云计算技术值得你投简历


下一篇:揭开云的面纱,从云的语言OpenAPI开始