2020年秋季面经(Java工程师)

总结自己两月来面试的一些经验,提供出来与大家分享,分为四部分,基础知识,算法题,项目考察和前瞻性与综合能力考察,希望能够帮助正在求职的人,祝愿大家前程似锦。

基础知识

简历中提到的使用过的技术,最容易复习和把握的部分。

Java

  1. JMM内存模型,volatile关键字(内存屏障),先行发生原则
    Java内存模型(Java Memory Model, JMM)

  2. JVM内存分配
    Java虚拟机的内存和对象的创建

  3. Java锁,内置锁synchronized,ReentrantLock,ReentrantReadWriteLock,StampedLock
    例如:synchronized和ReentrantLock的区别?ReentrantReadWriteLock了解吗?StampedLock知道吗?锁升级了解吗?读写锁升级?
    Java锁优化
    Java锁——synchronized、ReentrantLock和ReentrantReadWriteLock
    ReentrantLock源码解析
    ReentrantReadWriteLock源码解析
    JDK8的一种新的读写锁StampedLock
    synchronized实现原理

  4. AQS框架
    AbstractQueuedSynchronizer(AQS)——Java中同步类的基类

  5. ThreadLocal了解
    ThreadLocal的正确认识

  6. Java并发容器和阻塞队列,包括分段锁,树化为红黑树,如何对线程进行阻塞的
    Java并发阻塞队列——ArrayBlockingQueue和LinkedBlockingQueue
    Java并发容器——Hashtable和ConcurrentHashMap

  7. Java线程池
    Java线程池ThreadPoolExecutor的实现和参数
    Java8线程池——底层为LinkedBlockingQueue的ThreadPoolExecutor
    Java线程池如何设置

  1. Java的HashMap,LinkedList的源码实现
    Java的ArrayList源码解析
    Java的LinkedList源码解析
    Java的HashMap源码解析
    Java8 HashMap的迭代器和转化Set的实现
    Java8 HashMap的红黑树实现
    Java HashMap表的大小为什么必须是2的幂次
    Java8 HashMap 函数tableSizeFor详解

  2. Java垃圾回收机制,垃圾回收器,可达性分析,GC Roots,回收算法
    HotSpot虚拟机的垃圾收集器
    Java内存回收算法
    Java内存分代理论
    Java内存垃圾收集

  3. Java类加载
    Class文件中的方法和字节码同步指令
    Java虚拟机——类加载机制
    Java虚拟机——类加载器

  4. Java方法调用,栈帧结构,模拟方法执行时局部变量表和操作栈的执行过程,重写和重载调用
    Java虚拟机——运行时栈帧结构
    Java虚拟机——方法调用

  5. Java的线程状态
    Java的线程状态

  6. JVM性能监控和排查命令
    JVM性能监控和排查命令

  7. Java异常体系
    Java异常体系

  8. Java IO和NIO
    Java IO和NIO

  9. Java通配符
    Java通配符——Set和Set<?>区别

  10. Java的计数信号量(Semaphore)、栅栏(CyclicBarrier)和闭锁(CountDownLatch)
    例如:如何等待多条线程执行后,再执行一个逻辑?
    Java的计数信号量(Semaphore)、栅栏(CyclicBarrier)和闭锁(CountDownLatch)

MySQL

  1. MySQL的InnoDB与MyISAM的区别
  2. MySQL的聚簇索引和覆盖索引
  3. MySQL的Binlog的格式和XA事务
  4. MySQL层次结构与SQL语句的执行
  5. MySQL InnoDB的锁
  6. MySQL的索引
  7. MySQL多版本并发控制MVCC
  8. MySQL的隔离级别

Redis

  1. Redis集群
  2. Redis主从复制原理
  3. Redis持久化
  4. Redis的IO多路复用——单线程的理解(Redis6.0之后的多线程)
  5. Redis键过期策略
  6. Redis分布式锁
  7. Redis的数据结构和数据对象
  8. Redis缓存雪崩、穿透和击穿
  9. Redis事务性

ZooKeeper

  1. Zookeeper基础
  2. ZooKeeper的分布式锁的实现
  3. ZooKeeper假死与脑裂
  4. ZooKeeper的一致性协议ZAB

分布式系统

  1. 分布式一致性——2PC和3PC
  2. 分布式一致性——TCC服务设计与实现
  3. 关于分布式平台数据同步一致性经验总结
  4. Redis集群
  5. ZooKeeper的一致性协议ZAB
  6. 分布式锁的多种实现方式

ElasticSearch

  1. ElasticSearch简介
  2. ElasticSearch写入数据的底层存储
  3. ElasticSearch关于数据的操作
  4. ElasticSearch分布式
  5. ElasticSearch映射和分析

网络基础

  1. HTTP协议——超文本传送协议
  2. 计算机网络基础知识——网络层
  3. 计算机网络基础知识——运输层

HBase基础

  1. HBase的存储结构——LSM-Tree
  2. HBase最简洁的经验总结
  3. HBase的架构
  4. HBase一个经典的应用示例
  5. HBase RegionServer分裂的实现

RocketMQ

RocketMQ消息流转和有序性

设计模式

  1. 设计模式(1)——单例模式Java实现
  2. 设计模式(2)——观察者模式Java实现
  3. 设计模式(3)——装饰者模式Java实现
  4. 设计模式(4)——适配器模式Java实现
  5. 设计模式(5)——外观模式

算法题

目前绝大多数互联网公司面试都会进行类似的算法考察。一般而言,算法写的不好,大概率不通过。

字符串

判断一个字符串是否是另一个字符串的子串
String字符串表示的数字相加(LeetCode415.字符串相加)
解析数字字符串为IPv4地址
两个字符串的最长公共子串的长度
最长回文子串(LeetCode5.最长回文子串)

数组

数组中找2个数之和为target
两个升序整型数组求交集
找到 K 个最接近的元素(LeetCode658.找到 K 个最接近的元素)
找出数组中重复超过一半的数(LeetCode Offer 39. 数组中出现次数超过一半的数字)
数组中连续子数组的最大和(LeetCode53. 最大子序和)
数组中连续子数组的最大乘积(LeetCode152. 乘积最大子数组)
最长连续升序子串
最长上升子序列(LeetCode300. 最长上升子序列)

链表

将二叉搜索树转化为排序的双向链表
两个有序(顺序未知)单向链表合并为一个可指定为升序或降序的链表
删除有序链表中的重复元素(LeetCode83. 删除排序链表中的重复元素)
两个链表的第一个公共节点
单向链表排序
链表中的节点两两交换(LeetCode--24.两两交换链表中的节点)
有序链表删除重复的节点,只保留不重复的节点
单向链表是否回文(LeetCode234.回文链表)

二叉树的蛇形层次遍历(LeetCode.103)
将二叉搜索树转化为排序的双向链表
二叉树的深度和平衡二叉树(LeetCode 剑指Offer 55-I和II)
二叉树(或二叉搜索树)的最近公共祖先(LeetCode Offer 68 -I和II)
二叉树中和为某一值的路径(LeetCode Offer 34)
数据对数组构造多叉树
用数组构造最大堆结构
镜像二叉树(LeetCode101. 对称二叉树)
翻转二叉树(LeetCode226. 翻转二叉树)

多线程

两个线程同时执行循环操作
多个线程顺序依次打印0到N个数字

Lake counting
N个集合,每个集合选一个元素组成新集合,打印所有结果

其他

LRU缓存机制(LeetCode.146)
杨辉三角
车队问题
一个连续乘法的算式多少种计算方法

项目考察

架构和建模能力。基于平时开发项目的积累,很难通过复习提高。

  1. 业务建模。基于业务角度思考。主要考察项目功能的可扩展,未来业务发展,新增功能和添加业务需求时,系统设计是否灵活。
    例如:当前实现一种赠送红宝石的功能,如果未来增加蓝宝石、黄宝石、绿宝石等等,现在的系统是否考虑到这些问题了?是否在现在的系统可以快速的实现新的需求?
    例如:某个APP新闻推送,你觉得算法的推送逻辑应该是什么样子的?如果用户处于未登录状态呢?如果用户先登入再退出呢?这些场景推送的算法逻辑需要改变吗?
    这是一种对业务深入理解后,项目开发经验增加后,培养的一种建模能力。

  2. 项目复杂度。基于技术角度的思考。主要还是流量导向,如果是一个流量很大,QPS很高,技术实现绝对复杂,就会引起面试官的兴趣。会认为面试者具有很强的技术处理很复杂情况的能力。这种项目可遇不可求,建议还是把平凡的事做到完美。

前瞻性和综合能力考察

最难以把握的部分,基础知识可以复习,项目是经验的积累。

  1. 前瞻性考察是对行业最新动态的把握,包括对互联网行业赛道自己的思考,和最前沿技术的理解等。
    例如,到目前最新的Java版本是Java15,那么Java15有什么新的功能吗?除了常用的HotSpot虚拟机,还了解其他的虚拟机吗?或者某一个具体领域最近有什么最新的研究成果,可以谈谈吗?这些知识不会应用在当前工作中,据我所知大多数公司的Java都是使用的Java8,未来有一天说不定直接升级到Java20了,也就是可能有很多人永远也不会用到Java15,更别提各个版本了。这种前瞻性的掌握其实大体反映了一个人的发展程度,对行业最新技术和行情的把握,可能决定着未来发展的高度。所以,热爱的人应该时刻关注,不热爱的人很难做到。

  2. 综合能力在这里是除了技术能力以外的其他能力,一种抽象的概念。
    例如,平时如何提高自己的能力?通过什么方式进行自我学习?如果有新同学,你如何培养?组建团队或者团队扩大,如何进行管理?等等。

推荐阅读更多精彩内容