春招必备2022掘金最热门Java岗面试八股文汇总

357 阅读9分钟

前言

Java架构师应该是大家的一个职业目标了吧。要成为Java架构师,首先熟练使用各种框架,并知道它们实现的原理。jvm虚拟机原理、调优,懂得jvm能让你写出性能更好的代码;什么对象池,连接池,线程池...java反射技术,写框架必备的技术, 总之一句话越基础的东西越重要,很多人认为自己会用它们写代码了,其实仅仅是知道如何调用api而已,离会用还差的远。互联网发展迅速的时代,只能跟上时代的进步,才不会被淘汰。
纯粹是常用的技术,还有很多自己慢慢去摸索吧;因为要知道的东西很多,所以要成为一名合格的架构师,必须要有强大的自学能力,没有人会手把手的教给你所有的东西。想成为架构师不是懂了一大堆技术就可以了,这些是解决问题的基础、是工具,不懂这些怎么去提解决方案呢?这是成为架构师的必要条件。

备战春招 2022年头条最热门的Java岗面试八股文汇总

基础

  1. Java线程的状态
  2. 进程和线程的区别,进程间如何通讯,线程间如何通讯
  3. HashMap的数据结构是什么?如何实现的。和HashTable,ConcurrentHashMap的区别
  4. Cookie和Session的区别
  5. 索引有什么用?如何建索引?
  6. ArrayList是如何实现的,ArrayList和LinkedList的区别?ArrayList如何实现扩容。
  7. equals方法实现
  8. 面向对象
  9. 线程状态,BLOCKED和WAITING有什么区别
  10. JVM如何加载字节码文件
  11. JVM GC,GC算法。
  12. 什么情况会出现Full GC,什么情况会出现yong GC。
  13. JVM内存模型
  14. Java运行时数据区
  15. 事务的实现原理
    16.drop,delete与truncate的区别

相同点:

truncate和不带where子句的delete,以及drop都会删除表内的数据

不同点:

  • truncate会清除表数据并重置id从1开始,delete就只删除记录,drop可以用来删除表或数据库并且将表所占用的空间全部释放
  • truncate和delete只删除数据不删除表的结构。drop语句将删除表的结构被依赖的约(constrain),触发器(trigger),依赖于该表的存储过程/函数将保留,但是变为 invalid 状态。
  • 速度上一般来说: drop> truncate > delete
  • 使用上,想删除部分数据行用 delete,想删除表用 drop,想保留表而将所有数据删除,如果和事务无关,用truncate即可。如果和事务有关,或者想触发trigger,还是用delete。
  • delete是DML语句,不会自动提交。drop/truncate都是DDL语句,执行后会自动提交。

2.mysql里记录货币用什么字段类型好

NUMERIC 和DECIMAL 类型被MySQL实现为同样的类型,这在SQL92标准允许。他们被用于保存值,该值的准确精度是极其重要的值,例如与金钱有关的数据。

DECIMAL和NUMERIC值作为字符串存储,而不是作为二进制浮点数,以便保存那些值的小数精度。

3.MySQL中myisam与innodb的区别

  • InnoDB支持事务,而MyISAM不支持事务
  • InnoDB支持行级锁,而MyISAM支持表级锁
  • InnoDB支持MVCC, 而MyISAM不支持
  • InnoDB支持外键,而MyISAM不支持
  • InnoDB不支持全文索引,而MyISAM支持。
  • InnoDB不能通过直接拷贝表文件的方法拷贝表到另外一台机器, myisam 支持
  • InnoDB表支持多种行格式, myisam 不支持
  • InnoDB是索引组织表, myisam 是堆表

框架

  1. 看过哪些开源框架的源码
  2. 为什么要用Redis,Redis有哪些优缺点?Redis如何实现扩容?
  3. Netty是如何使用线程池的,为什么这么使用
  4. 为什么要使用Spring,Spring的优缺点有哪些
  5. Spring的IOC容器初始化流程
  6. Spring的IOC容器实现原理,为什么可以通过byName和ByType找到Bean
  7. Spring AOP实现原理
  8. 消息中间件是如何实现的,技术难点有哪些

\

技术深度

  1. 有没有看过JDK源码,看过的类实现原理是什么。
  2. HTTP协议
  3. TCP协议
  4. 一致性Hash算法
  5. JVM如何加载字节码文件
  6. 类加载器如何卸载字节码
  7. IO和NIO的区别,NIO优点
  8. Java线程池的实现原理,keepAliveTime等参数的作用。
  9. HTTP连接池实现原理
  10. 数据库连接池实现原理
  11. 数据库的实现原理
    数据结构

• 在 JDK1.8 中,HashMap 是由数组+链表+红黑树构成

• 当一个值中要存储到 HashMap 中的时候会根据 Key 的值来计算出他的 hash,通过 hash 值来确认存放到数组中的位置,如果发生 hash 冲突就以链表的形式存储,当链表过长的话,HashMap 会把这个链表转换成红黑树来存储。

备战春招 2022年头条最热门的Java岗面试八股文汇总

我个人觉得这样设计有以下几个好处:

  1. 当数组长度为 2 的幂次方时,可以使用位运算来计算元素在数组中的下标

HashMap 是通过 index=hash&(table.length-1) 这条公式来计算元素在 table 数组中存放的下标,就是把元素的 hash 值和数组长度减1的值做一个与运算,即可求出该元素在数组中的下标,这条公式其实等价于 hash%length,也就是对数组长度求模取余,只不过只有当数组长度为 2 的幂次方时,hash&(length-1) 才等价于 hash%length,使用位运算可以提高效率。

  1. 增加 hash 值的随机性,减少 hash 冲突

如果 length 为 2 的幂次方,则 length-1 转化为二进制必定是 11111……的形式,这样的话可以使所有位置都能和元素 hash 值做与运算,如果是如果 length 不是 2 的次幂,比如 length 为 15,则 length-1 为 14,对应的二进制为 1110,在和 hash 做与运算时,最后一位永远都为 0 ,浪费空间。

系统架构

  1. 如何搭建一个高可用系统
  2. 哪些设计模式可以增加系统的可扩展性
  3. 介绍设计模式,如模板模式,命令模式,策略模式,适配器模式、桥接模式、装饰模式,观察者模式,状态模式,访问者模式。
  4. 抽象能力,怎么提高研发效率。
  5. 什么是高内聚低耦合,请举例子如何实现
  6. 什么情况用接口,什么情况用消息
  7. 如果AB两个系统互相依赖,如何解除依赖
  8. 如何写一篇设计文档,目录是什么
  9. 什么场景应该拆分系统,什么场景应该合并系统
  10. 系统和模块的区别,分别在什么场景下使用

分布式

  1. 分布式事务,两阶段提交。
  2. 如何实现分布式锁
  3. 如何实现分布式Session
  4. 如何保证消息的一致性
  5. 负载均衡
  6. 正向代理(客户端代理)和反向代理(服务器端代理)
  7. CDN实现原理
  8. 怎么提升系统的QPS和吞吐量

Redis 为何这么快

\

面试官: Redis 作为缓存大家都在用,那 Redis 一定很快咯?

\

我: 当然了,官方提供的数据可以达到 100000+ 的 QPS(每秒内的查询次数),这个数据不比 Memcached 差!

\

面试官: Redis 这么快,它的“多线程模型”你了解吗?(露出邪魅一笑)

\

我: 您是想问 Redis 这么快,为什么还是单线程的吧。Redis 确实是单进程单线程的模型,因为 Redis 完全是基于内存的操作,CPU 不是 Redis 的瓶颈,Redis 的瓶颈最有可能是机器内存的大小或者网络带宽。

\

既然单线程容易实现,而且 CPU 不会成为瓶颈,那就顺理成章的采用单线程的方案了(毕竟采用多线程会有很多麻烦)。

\

面试官: 嗯,是的。那你能说说 Redis 是单线程的,为什么还能这么快吗?

\

我: 可以这么说吧,总结一下有如下四点:

  • Redis 完全基于内存,绝大部分请求是纯粹的内存操作,非常迅速,数据存在内存中,类似于 HashMap,HashMap 的优势就是查找和操作的时间复杂度是 O(1)。
  • 数据结构简单,对数据操作也简单。
  • 采用单线程,避免了不必要的上下文切换和竞争条件,不存在多线程导致的 CPU 切换,不用去考虑各种锁的问题,不存在加锁释放锁操作,没有死锁问题导致的性能消耗。
  • 使用多路复用 IO 模型,非阻塞 IO。

\

Redis 和 Memcached 的区别

\

面试官: 嗯嗯,说的很详细。那你为什么选择 Redis 的缓存方案而不用 Memcached 呢?

\

我: 原因有如下四点:

  • 存储方式上: Memcache 会把数据全部存在内存之中,断电后会挂掉,数据不能超过内存大小。Redis 有部分数据存在硬盘上,这样能保证数据的持久性。
  • 数据支持类型上: Memcache 对数据类型的支持简单,只支持简单的 key-value,,而 Redis 支持五种数据类型。
  • 使用底层模型不同: 它们之间底层实现方式以及与客户端之间通信的应用协议不一样。Redis 直接自己构建了 VM 机制,因为一般的系统调用系统函数的话,会浪费一定的时间去移动和请求。
  • Value 的大小: Redis 可以达到 1GB,而 Memcache 只有 1MB。

\

淘汰策略

\

面试官: 那你说说你知道的 Redis 的淘汰策略有哪些?

\

我: Redis 有六种淘汰策略,如下图:

备战春招 2022年头条最热门的Java岗面试八股文汇总

补充一下: Redis 4.0 加入了 LFU(least frequency use)淘汰策略,包括 volatile-lfu 和 allkeys-lfu,通过统计访问频率,将访问频率最少,即最不经常使用的 KV 淘汰。

最后

欢迎大家一起交流,喜欢文章记得关注我点赞转发哟,感谢支持!

关注我,私信备注13 即可获取整理的这份2022年最新Java面试资料!

希望能帮助到你面试前的复习且找到一个好的工作,也节省大家在网上搜索资料的时间来学习。

image.png