总结自己两月来面试的一些经验,提供出来与大家分享,分为四部分,基础知识,算法题,项目考察和前瞻性与综合能力考察,希望能够帮助正在求职的人,祝愿大家前程似锦。
基础知识
简历中提到的使用过的技术,最容易复习和把握的部分。
Java
JMM内存模型,volatile关键字(内存屏障),先行发生原则
Java内存模型(Java Memory Model, JMM)JVM内存分配
Java虚拟机的内存和对象的创建Java锁,内置锁synchronized,ReentrantLock,ReentrantReadWriteLock,StampedLock
例如:synchronized和ReentrantLock的区别?ReentrantReadWriteLock了解吗?StampedLock知道吗?锁升级了解吗?读写锁升级?
Java锁优化
Java锁——synchronized、ReentrantLock和ReentrantReadWriteLock
ReentrantLock源码解析
ReentrantReadWriteLock源码解析
JDK8的一种新的读写锁StampedLock
synchronized实现原理ThreadLocal了解
ThreadLocal的正确认识Java并发容器和阻塞队列,包括分段锁,树化为红黑树,如何对线程进行阻塞的
Java并发阻塞队列——ArrayBlockingQueue和LinkedBlockingQueue
Java并发容器——Hashtable和ConcurrentHashMapJava线程池
Java线程池ThreadPoolExecutor的实现和参数
Java8线程池——底层为LinkedBlockingQueue的ThreadPoolExecutor
Java线程池如何设置
Java的HashMap,LinkedList的源码实现
Java的ArrayList源码解析
Java的LinkedList源码解析
Java的HashMap源码解析
Java8 HashMap的迭代器和转化Set的实现
Java8 HashMap的红黑树实现
Java HashMap表的大小为什么必须是2的幂次
Java8 HashMap 函数tableSizeFor详解Java垃圾回收机制,垃圾回收器,可达性分析,GC Roots,回收算法
HotSpot虚拟机的垃圾收集器
Java内存回收算法
Java内存分代理论
Java内存垃圾收集Java方法调用,栈帧结构,模拟方法执行时局部变量表和操作栈的执行过程,重写和重载调用
Java虚拟机——运行时栈帧结构
Java虚拟机——方法调用Java的线程状态
Java的线程状态JVM性能监控和排查命令
JVM性能监控和排查命令Java异常体系
Java异常体系Java IO和NIO
Java IO和NIOJava通配符
Java通配符——Set和Set<?>区别Java的计数信号量(Semaphore)、栅栏(CyclicBarrier)和闭锁(CountDownLatch)
例如:如何等待多条线程执行后,再执行一个逻辑?
Java的计数信号量(Semaphore)、栅栏(CyclicBarrier)和闭锁(CountDownLatch)
MySQL
- MySQL的InnoDB与MyISAM的区别
- MySQL的聚簇索引和覆盖索引
- MySQL的Binlog的格式和XA事务
- MySQL层次结构与SQL语句的执行
- MySQL InnoDB的锁
- MySQL的索引
- MySQL多版本并发控制MVCC
- MySQL的隔离级别
Redis
- Redis集群
- Redis主从复制原理
- Redis持久化
- Redis的IO多路复用——单线程的理解(Redis6.0之后的多线程)
- Redis键过期策略
- Redis分布式锁
- Redis的数据结构和数据对象
- Redis缓存雪崩、穿透和击穿
- Redis事务性
ZooKeeper
分布式系统
ElasticSearch
网络基础
HBase基础
RocketMQ
设计模式
算法题
目前绝大多数互联网公司面试都会进行类似的算法考察。一般而言,算法写的不好,大概率不通过。
字符串
判断一个字符串是否是另一个字符串的子串
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. 翻转二叉树)
多线程
图
Lake counting
N个集合,每个集合选一个元素组成新集合,打印所有结果
其他
LRU缓存机制(LeetCode.146)
杨辉三角
车队问题
一个连续乘法的算式多少种计算方法
项目考察
架构和建模能力。基于平时开发项目的积累,很难通过复习提高。
业务建模。基于业务角度思考。主要考察项目功能的可扩展,未来业务发展,新增功能和添加业务需求时,系统设计是否灵活。
例如:当前实现一种赠送红宝石的功能,如果未来增加蓝宝石、黄宝石、绿宝石等等,现在的系统是否考虑到这些问题了?是否在现在的系统可以快速的实现新的需求?
例如:某个APP新闻推送,你觉得算法的推送逻辑应该是什么样子的?如果用户处于未登录状态呢?如果用户先登入再退出呢?这些场景推送的算法逻辑需要改变吗?
这是一种对业务深入理解后,项目开发经验增加后,培养的一种建模能力。项目复杂度。基于技术角度的思考。主要还是流量导向,如果是一个流量很大,QPS很高,技术实现绝对复杂,就会引起面试官的兴趣。会认为面试者具有很强的技术处理很复杂情况的能力。这种项目可遇不可求,建议还是把平凡的事做到完美。
前瞻性和综合能力考察
最难以把握的部分,基础知识可以复习,项目是经验的积累。
前瞻性考察是对行业最新动态的把握,包括对互联网行业赛道自己的思考,和最前沿技术的理解等。
例如,到目前最新的Java版本是Java15,那么Java15有什么新的功能吗?除了常用的HotSpot虚拟机,还了解其他的虚拟机吗?或者某一个具体领域最近有什么最新的研究成果,可以谈谈吗?这些知识不会应用在当前工作中,据我所知大多数公司的Java都是使用的Java8,未来有一天说不定直接升级到Java20了,也就是可能有很多人永远也不会用到Java15,更别提各个版本了。这种前瞻性的掌握其实大体反映了一个人的发展程度,对行业最新技术和行情的把握,可能决定着未来发展的高度。所以,热爱的人应该时刻关注,不热爱的人很难做到。综合能力在这里是除了技术能力以外的其他能力,一种抽象的概念。
例如,平时如何提高自己的能力?通过什么方式进行自我学习?如果有新同学,你如何培养?组建团队或者团队扩大,如何进行管理?等等。