一个毕业三年的Java小白的面试经历

一个毕业三年的Java小白的面试经历

  • 前言
  • 面试问题
    • 第一档
      • 数据结构
      • 设计模式
      • Spring(IOC、AOP)
      • SpringBoot+SpringCloud
      • ORM(JPA、Mybatis)
      • 消息队列(Kafka、RabbitMq)
      • 缓存(Redis、MongDB、Memcache)
      • 数据库(Mysql,Oracle)
    • 第二档
      • JVM内存结构和类加载机制
      • 线程池原理
      • 分库分表
      • 动态代理
    • 第三档
      • 分布式事务(两阶提交协议、三阶提交协议)
      • 如何保证消息只被消费一次,怎么做幂等性
      • 如何解决Json序列化是的循环引用(CycelReference)
  • 总结

前言

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场面试。碰到一些真正的技术大牛面你,可能都不能理解他问的问题。当然也有一些比较水的面试官,你反问他一个问题他就傻了。

你可能感兴趣的:(Java)