一个毕业三年的Java小白的面试经历
前言
2016-2019,不知不觉已经毕业工作三年。因为一些个人的原因恰好也在这个时间点寻找新的工作,在此记录一下我在面试中被问频率较高的问题。
面试问题
第一档
基本属于必问的问题,可能也是比较基础的问题
数据结构
(Set、List、HashMap)这里比较基础的问题就是List的两种实现,数组和链表;HashMap的put函数的原理,我在面试中碰到一个比较有趣的问题是如何重写一个对象的hashCode和equals方法,让一个对象快速的插入。
设计模式
问的比较浅的会问一些常用的设计模式(单例、工厂、模板、适配器、监听器、桥接、策略)的使用前景,问的比较深的可能会问一些设计的原则(单一职责、里氏替换、依赖倒置、接口隔离、迪米特、开闭)
Spring(IOC、AOP)
这两个概念是Spring的基础知识,也是最难理解的部分。更是支撑Spring在企业开发中最重要的基石。【死磕 Spring】—– IOC 总结
SpringBoot+SpringCloud
这里我遇到的问题通常是SpringBoot和Spring的区别以及SpingCloud在微服务架构中起到的作用。
ORM(JPA、Mybatis)
主要就是Mybatis的一些常用标签,以及它的二级缓存
消息队列(Kafka、RabbitMq)
主要涉及主从同步、消息持久化、高可用、使用场景的问题。都是比较概念性的问题,如果涉及到一些底层的东西,我就傻眼了
缓存(Redis、MongDB、Memcache)
因为我实际项目中也只用到过Redis,所以面试官会问我一些Redis相关的。大概就是它的内部数据结构,数据的持久化,如何做分布式锁。当然还有一些缓存雪崩或者击穿的问题,但从未有人问过。
数据库(Mysql,Oracle)
这里只讨论Mysql(因为博主Oracle用得比较少)这个话题应该是最能聊的话题,因为涉及的东西太广太宽了。
- 如何建表(考虑数据库的数据类型,Mysql为数值、字符、时间等都有多种选择,在合适的场景选用合适的数据类型就可以提升系统的性能)
- 如何简历高性能的索引(要讨论这个,必须要懂索引的类型,Innodb默认的B+Tree,B+Tree的存储结构,哈希索引在哪种场景下使用,虽然Innodb不支持哈希索引,怎么在Innodb的储存引擎下模拟一个哈希索引)
- 如何性能优化(必须要懂如何查选sql的执行计划,以及Mysql如何执行关联查询,然后才懂得怎么优化COUNT()、关联查询、子查询、GROUP、DISTINCT、LIMIT、UNION)。
面试只要懂这三样应该就差不多了,以后有时间总结一下自己对Mysql这一块的了解。推荐大家看一看《高性能Mysql》。
这一块算是比较Java后端比较基础的知识。
第二档
可能会问到的问题,可能是比较进阶的问题
JVM内存结构和类加载机制
可以参考下面的博客 Java 运行时的内存划分 | 类加载机制 在一次面试被问及过OOM的问题(递归调用内存泄漏是发生在栈,而在 Java 堆中只要不断的创建对象,并且 GC-Roots 到对象之间存在引用链,在JVM 不会回收这些对象的情况下最终会发生堆内内存泄漏)
线程池原理
建议大家直接去看JDK的TheadPoolExcutor源码,了解它初始化时每一个属性的意义。或者看下这篇博客线程池中你不容错过的一些细节。
分库分表
我在实际项目中用ShardingJDBC做过一次分表,所以还是有一定经验,选取能够区分业务数据的字段,然后选择合适的哈希函数,来对数据进行拆分,对查询进行分流就可以了。这个话题还可以引申到一致性Hash算法。
动态代理
其实这个问题也是AOP的一部分,面试官一般让我聊聊Spring的动态代理和JDK的CGLIB的区别(JDK 是基于接口实现,而 CGLIB 继承代理类)。
锁
这个话题也很广,而且具体的业务场景也可以用到不同的锁。
- 单点的锁,JDK提供的synchronized关键字,它是一个重量级的锁。还有ReentrantLock这样的重入锁
- 分布式锁,又分为了乐观锁和悲观锁,乐观采取了更加宽松的加锁机制,大多是基于数据版本( Version )记录机制实现。悲观锁大多数情况下依靠数据库的锁机制实现,以保证操作最大程度的独占性,悲观锁的实现方式有很多(基于 DB 的唯一索引,基于 ZK 的临时有序节点,基于 Redis 的 NX EX 参数)
第三档
频率很低的问题,可能是比较难的问题
分布式事务(两阶提交协议、三阶提交协议)
如何保证消息只被消费一次,怎么做幂等性
如何解决Json序列化是的循环引用(CycelReference)
因为这些问题我也不太懂,所以就不做评论了。如果以后有所了解, 再立博客和大家探讨。
总结
因为本人的学历和工作经历限制 ,没有获得一线大厂的面试机会;
有的人说面试之前要刷题,充分准备什么的。我个人觉得关键还是在平常的积累和储备;
我粗略算了一下,这次为期两个月的面试,我差不多沟通了60家企业,投递了27份简历,现场参加10场面试。碰到一些真正的技术大牛面你,可能都不能理解他问的问题。当然也有一些比较水的面试官,你反问他一个问题他就傻了。