2026版Java面试八股文全解析(含多线程/JVM/微服务),附真实大厂面经

张开发
2026/5/6 6:55:39 15 分钟阅读

分享文章

2026版Java面试八股文全解析(含多线程/JVM/微服务),附真实大厂面经
前言首先我们需要明白一个事实招聘的一个很关键的因素是在给自己找未来的同事同级别下要找比自己优秀的人面试是一个双向选择的过程也是一个将心比心去沟通的过程。就像我们有的人感觉自己很牛逼但是拿不到 offer而其他的人菜的一笔却可以拿到 offer我们称之为玄学 offer遇到这种情况大家也不要感觉到有什么不可描述的心情一切随缘即可一眼就能看得到头不是我们想要的生活我们为之努力不是为了飞黄腾达睥睨群雄而是努力让自己的生活多一种可能给自己的未来多一份惊喜。正文下面提的问题可以看下你自己是否能回答出来是否做好准备了当然面试题准备是一方面你本身的技能掌握是一方面本身技能不过硬也会被刷下来先说下面试流程一般大公司都有 3-4 轮技术面1 轮的 HR 面。就搜狐而言我共经历了 4 轮技术面前两轮主要是问基础和项目实现第 3 轮是交叉面两个面试官主要是问项目实现和拓展。第 4 轮是部门老大面主要就问一些架构、技术和业务的理解、个人发展比较抽象的东西了现在基本也是这样的。要注意的点简历一到两页为最佳将项目经历写 2-3 个左右就差不多了一定要写最有亮点的项目工作经历的起始时间要写清楚另外大公司都有背调不要合并或省略一些比较短的工作经历影响的可能不只是这次面试而是之后可能都无法进这家公司博客没什么好文章github 没好项目就不要写在简历中了对于面试官的问题想清楚再回答如果觉得需要的时间可能比较长可以跟面试官说我思考下、我整理下思路之类的面试的过程中注意语速和吐字本人在做面试官后发现很多人说话语速很快或吐字不清导致原本会的问题也会让面试官觉得你没答到点上尤其是电话面面试完后不要直接问面试结果技术考察总的来说技术相关的考察主要分为两大块一是基础二是经验基础包括 java 基础、数据库、中间件等来自于日常的积累和面试前的准备。经验包括以往做过的项目、解决的问题、以及一些场景题比如你的项目如果流量大了十倍如何保证可用。开场白简单的介绍一下自己的工作经历与职责在校或者工作中主要的工作内容主要负责的内容你的信息一清二白的写在简历上能答出来的最好写在上面模棱两可不是很清楚的最好不要写否则会被问的很尴尬介绍下自己最满意的有技术亮点的项目或平台重点介绍下自己负责那部分的技术细节主要对自己做过的事情是否有清晰的描述因为篇幅原因答案和解析全在末尾了分享一个写的很不错的框架源码图部分题目和解析1、STRING 与 STRINGBUFFER 的区别。答 STRING 的长度是不可变的STRINGBUFFER 的长度是可变的。如果你对字符串中的内容经常进行操作特别是内容要修改时那么使用 StringBuffer如果最后需要 String那么使用 StringBuffer 的 toString()方法2、谈谈 final, finally, finalize 的区别答 final—修饰符关键字如果一个类被声明为 final意味着它不能再派生出新的子类不能作为父类被继承。因此一个类不能既被声明为 abstract 的又被声明为 final 的。将变量或方法声明为 final可以保证它们在使用中不被改变。被声明为 final 的变量必须在声明时给定初值而在以后的引用中只能读取不可修改。被声明为 final 的方法也同样只能使用不能重载 finally—再异常处理时提供 finally 块来执行任何清除操作。如果抛出一个异常那么相匹配的 catch 子句就会执行然后控制就会进入 finally 块如果有的话finalize—方法名。Java 技术允许使用 finalize() 方法在垃圾收集器将对象从内存中清除出去之前做必要的清理工作。这个方法是由垃圾收集器在确定这个对象没有被引用时对这个对象调用的。它是在 Object 类中定义的因此所有的类都继承了它。子类覆盖 finalize() 方法以整理系统资源或者执行其他清理工作。finalize() 方法是在垃圾收集器删除对象之前对这个对象调用的3、面向对象的特征有哪些方面答 主要有以下四方面1.抽象抽象就是忽略一个主题中与当前目标无关的那些方面以便更充分地注意与当前目标有关的方面。抽象并不打算了解全部问题而只是选择其中的一部分暂时不用部分细节。抽象包括两个方面一是过程抽象二是数据抽象。2.继承继承是一种联结类的层次模型并且允许和鼓励类的重用它提供了一种明确表述共性的方法。对象的一个新类可以从现有的类中派生这个过程称为类继承。新类继承了原始类的特性新类称为原始类的派生类子类而原始类称为新类的基类父类。派生类可以从它的基类那里继承方法和实例变量并且类可以修改或增加新的方法使之更适合特殊的需要。3.封装封装是把过程和数据包围起来对数据的访问只能通过已定义的界面。面向对象计算始于这个基本概念即现实世界可以被描绘成一系列完全自治、封装的对象这些对象通过一个受保护的接口访问其他对象。4. 多态性多态性是指允许不同类的对象对同一消息作出响应。多态性包括参数化多态性和包含多态性。多态性语言具有灵活、抽象、行为共享、代码共享的优势很好的解决了应用程序函数同名问题。4、String 是最基本的数据类型吗答 基本数据类型包括 byte、int、char、long、float、double、boolean 和 short。java.lang.String 类是 final 类型的因此不可以继承这个类、不能修改这个类。为了提高效率节省空间我们应该用 StringBuffer 类5、int 和 Integer 有什么区别答 Java 提供两种不同的类型引用类型和原始类型或内置类型。Int 是 java 的原始数据类型Integer 是 java 为 int 提供的封装类。Java 为每个原始类型提供了封装类。原始类型封装类,booleanBoolean,charCharacter,byteByte,shortShort,intInteger,longLong,floatFloat,doubleDouble 引用类型和原始类型的行为完全不同并且它们具有不同的语义。引用类型和原始类型具有不同的特征和用法它们包括大小和速度问题这种类型以哪种类型的数据结构存储当引用类型和原始类型用作某个类的实例数据时所指定的缺省值。对象引用实例变量的缺省值为 null而原始类型实例变量的缺省值与它们的类型有关6、运行时异常与一般异常有何异同答 异常表示程序运行过程中可能出现的非正常状态运行时异常表示虚拟机的通常操作中可能遇到的异常是一种常见运行错误。java 编译器要求方法必须声明抛出可能发生的非运行时异常但是并不要求必须声明抛出未被捕获的运行时异常。7、说出 ArrayList,Vector, LinkedList 的存储性能和特性答 ArrayList 和 Vector 都是使用数组方式存储数据此数组元素数大于实际存储的数据以便增加和插入元素它们都允许直接按序号索引元素但是插入元素要涉及数组元素移动等内存操作所以索引数据快而插入数据慢Vector 由于使用了 synchronized 方法线程安全通常性能上较 ArrayList 差而 LinkedList 使用双向链表实现存储按序号索引数据需要进行前向或后向遍历但是插入数据时只需要记录本项的前后项即可所以插入速度较快。8、HashMap 和 Hashtable 的区别答 HashMap 是 Hashtable 的轻量级实现非线程安全的实现他们都完成了 Map 接口主要区别在于 HashMap 允许空null键值key,由于非线程安全效率上可能高于 Hashtable。HashMap 允许将 null 作为一个 entry 的 key 或者 value而 Hashtable 不允许。HashMap 把 Hashtable 的 contains 方法去掉了改成 containsvalue 和 containsKey。因为 contains 方法容易让人引起误解。 Hashtable 继承自 Dictionary 类而 HashMap 是 Java1.2 引进的 Map interface 的一个实现。最大的不同是Hashtable 的方法是 Synchronize 的而 HashMap 不是在多个线程访问 Hashtable 时不需要自己为它的方法实现同步而 HashMap 就必须为之提供外同步。 Hashtable 和 HashMap 采用的 hash/rehash 算法都大概一样所以性能不会有很大的差异。9、heap 和 stack 有什么区别答 栈是一种线形集合其添加和删除元素的操作应在同一段完成。栈按照后进先出的方式进行处理。堆是栈的一个组成元素10、Java 的接口和 C的虚类的相同和不同处答 由于 Java 不支持多继承而有可能某个类或对象要使用分别在几个类或对象里面的方法或属性现有的单继承机制就不能满足要求。与继承相比接口有更高的灵活性因为接口中没有任何实现代码。当一个类实现了接口以后该类要实现接口里面所有的方法和属性并且接口里面的属性在默认状态下面都是 public static,所有方法默认情况下是 public.一个类可以实现多个接口。更多面试题一、性能优化面试专栏tomcat 性能优化整理JVM 性能优化专题Mysql 性能优化整理Tomcat 顶层架构小结1Tomcat 中只有一个 Server一个 Server 可以有多个 Service一个 Service 可以有多个 Connector 和一个 Container2 Server 掌管着整个 Tomcat 的生死大权4Service 是对外提供服务的5Connector 用于接受请求并将请求封装成 Request 和 Response 来具体处理6Container 用于封装和管理 Servlet以及具体处理 request 请求知道了整个 Tomcat 顶层的分层架构和各个组件之间的关系以及作用对于绝大多数的开发人员来说 Server 和 Service 对我们来说确实很远而我们开发中绝大部分进行配置的内容是属于 Connector 和 Container 的所以接下来介绍一下 Connector 和 Container。Connector 和 Container 的微妙关系由上述内容我们大致可以知道一个请求发送到 Tomcat 之后首先经过 Service 然后会交给我们的 ConnectorConnector 用于接收请求并将接收的请求封装为 Request 和 Response 来具体处理Request 和 Response 封装完之后再交由 Container 进行处理Container 处理完请求之后再返回给 Connector最后在由 Connector 通过 Socket 将处理的结果返回给客户端这样整个请求的就处理完了Connector 最底层使用的是 Socket 来进行连接的Request 和 Response 是按照 HTTP 协议来封装的所以 Connector 同时需要实现 TCP/IP 协议和 HTTP 协议Tomcat 既然处理请求那么肯定需要先接收到这个请求接收请求这个东西我们首先就需要看一下 Connector更多解析二、微服务架构面试专栏1、SpringCloud 面试整理2、SpringBoot 面试整理3、Dubbo 面试整理请谈一下 你对 SpringBoot 和 SpringCloud 的理解SpringBoot专注于快速方便的开发单个个体微服务关注微观SpringCloud关注全局的微服务协调治理框架将 SpringBoot 开发的一个个单体微服务组合并管理起来关注宏观SpringBoot 可以离开 SpringCloud 独立使用但是 SpringCloud 不可以离开 SpringBoot属于依赖关系什么是服务熔断什么是服务降级服务熔断这种模式主要是参考电路熔断如果一条线路电压过高保险丝会熔断防止火灾。放到我们的系统中如果某个目标服务调用慢或者有大量超时此时熔断该服务的调用对于后续调用请求不在继续调用目标服务直接返回快速释放资源。如果目标服务情况好转则恢复调用。熔断机制的注解是 HystrixCommand熔断机制是应对雪崩效应的一种链路保护机制一般存在于服务端当扇出链路的某个服务出现故障或响应超时会进行服务降级进而熔断该节点的服务调用快速返回“错误”的相应信息服务降级当系统整体资源快不够的时候忍痛将部分服务暂时关闭带渡过难关后再重新开启。降级处理时在客户端完成的与服务端没有关系理解所谓降级一般是从整体负荷考虑当某个服务熔断之后服务器将不再被调用此时客户端可以自己准备一个本地的 FallBack 回调返回一个缺省值。这样做虽然服务水平下降但好歹可用比直接挂掉好为什么要解耦如果按照上面的熔断案例来做的话Controller 下的每个方法都要给其编写一个 FallBack 方法当方法慢慢变多就会造成代码膨胀一个是增加编写的工作量另外一个也会增大维护的难度代码的耦合度也会高是十分不合理的所以要将其解耦。解耦思路因为服务端的是通过实现接口访问服务端的如果在父接口上实现了 FallBack 方法通过这样一种方式去维护起来就能实现解耦也顺便完成了降级的机制。更多解析三、并发编程高级面试专栏由于篇幅原因无法全部展示需要这份资料可以在文末获取四、开源框架面试专栏4.1、Spring 面试整理4.2、SpringMVC 面试整理4.3、MyBatis 面试整理1、选择使用 Spring 框架的原因?使用 Spring 第一是使用它的 IOC 功能在解耦上达到了配置级别。 第二是使用它对数据库访问事务相关的封装。 第三就是各种其他组件与 Spring 的融合在 Spring 中更加方便快捷的继承其他一些组件。2、Spring 是如何管理事务的spring 的事务声明有两种方式编程式和声明式。spring 主要是通过“声明式事务”的方式对事务进行管理即在配置文件中进行声明通过 AOP 将事务切面切入程序最大的好处是大大减少了代码量。3、Spring IoC 容器配置 Bean 的方式答基于 XML 文件进行配置。基于注解进行配置。基于 Java 程序进行配置Spring 3更多解析五、分布式面试专栏分布式限流面试整理分布式通讯面试整理分布式数据库面试整理请解释 Nginx 如何处理 HTTP 请求。Nginx 使用反应器模式。主事件循环等待操作系统发出准备事件的信号这样数据就可以从套接字读取在该实例中读取到缓冲区并进行处理。单个线程可以提供数万个并发连接。在 Nginx 中如何使用未定义的服务器名称来阻止处理请求?只需将请求删除的服务器就可以定义为Server {listen 80;server_name “ “ ;return 444;}这里服务器名被保留为一个空字符串它将在没有“主机”头字段的情况下匹配请求而一个特殊的 Nginx 的非标准代码 444 被返回从而终止连接。更多题目和答案解析最后欢迎做 Java 的工程师朋友们可以点击下方名片免费获取这份面试题 PDF还有更多免费的 Java 架构学习资料其中覆盖了互联网的方方面面期间碰到各种产品各种场景下的各种问题希望可以帮助大家扩展自己的技术广度和知识面。

更多文章