Java面试通常涉及Java编程语言、面向对象编程、Java核心库、多线程、数据库、Web框架等,下面详解Java面经@mikechen
以下是一些可能会在Java面试中被问到的常见问题和主题:
Java编程语言
1.Java基本类型有哪些?
主要包含:8种。
2.Java引用类型有哪些?
Java对象的引用被划分为4种级别,这4种级别由高到低依次为:强引用、软引用、弱引用和虚引用。
强引用(Strong Reference):强引用是最常见的引用类型,通常是通过赋值操作创建的。
软引用(Soft Reference):软引用允许对象在内存不足时被垃圾回收,通常用于实现内存敏感的缓存。
弱引用(Weak Reference):弱引用允许对象在任何时候被垃圾回收,无论内存是否足够。
虚引用(Phantom Reference):虚引用不会影响对象的生命周期,主要用于对象被回收前进行清理或处理其他任务。
3.”==”和equals方法究竟有什么区别?
"=="
是一个运算符,用于比较两个对象的引用是否相等,即它们是否引用内存中的相同对象。
如果两个引用指向内存中的同一个对象,"=="
返回 true
。
equals 方法是一个Java中的方法,用于比较两个对象的内容是否相等。
需要注意的是,如果要自定义类的equals方法来进行内容比较,通常还需要覆盖hashCode方法,以确保equals和hashCode的一致性。
4.什么是Java的自动装箱和拆箱?
自动装箱是指:将基本数据类型自动转换为对应的包装类型。
int primitiveInt = 42; Integer boxedInt = primitiveInt; // 自动装箱,将int转换为Integer
自动拆箱是指:将包装类型自动转换为对应的基本数据类型。
Integer boxedInt = 42; int primitiveInt = boxedInt; // 自动拆箱,将Integer转换为int
5.final finally finalize区别?
final
- final 是一个修饰符,可以应用于类、方法、字段等。
- 当应用于类时,表示该类不能被继承。
- 当应用于方法时,表示该方法不能被子类重写(覆盖)。
- 当应用于字段时,表示该字段是常量,不可再分配新值。
finally
finally 是一个关键字,用于结构化异常处理,比如:try-catch-finally。
try { // 一些代码,可能会抛出异常 } catch (Exception e) { // 异常处理 } finally { // 无论是否发生异常,这里的代码都会执行 // 常用于资源关闭或清理操作 }
finally 块中的代码总是会被执行,无论是否发生异常,它通常用于确保资源的释放或清理。
finalize
finalize 是一个方法,属于Object类的一部分,用于垃圾回收。
在垃圾回收器将对象销毁前,会调用对象的 finalize
方法,允许对象执行清理操作。
class MyObject { // 重写finalize方法以执行清理操作 @Override protected void finalize() throws Throwable { // 清理操作 super.finalize(); } }
6.String、StringBuffer、StringBuilder的区别?
String(字符串):String 是不可变的,一旦创建一个 String 对象,它的内容不能被更改。
StringBuffer(字符串缓冲区):StringBuffer 是可变的,用于处理多线程环境下的字符串操作,因为它的方法都是同步的,是线程安全的。
StringBuilder(字符串生成器):StringBuilder 也是可变的,StringBuilder线程不安全速度较快。
7.Java权限修饰符有哪些?
public(公共):具有public
权限修饰符的成员可以被任何类访问,无论它们是否在同一包中或不在同一包中。
protected(受保护):具有protected
权限修饰符的成员对于同一包中的类是可见的,并且对于不在同一包中但继承了包含该成员的类的子类也是可见的。
默认(包级别,默认):如果没有使用任何权限修饰符,成员的访问级别被视为默认(包级别),这意味着它只能被同一包中的类访问。
private(私有):具有private
权限修饰符的成员只能在包含它们的类内部访问,其他类无法访问这些成员。
这四个作用域的可见范围,如下表所示:
作用域 |
当前类 |
同package |
子孙类 |
其他package |
---|---|---|---|---|
public |
√ |
√ |
√ |
√ |
protected |
√ |
√ |
√ |
× |
friendly |
√ |
√ |
× |
× |
private |
√ |
× |
× |
× |
8.error和exception有什么区别?
Error
是 java.lang.Error
类的子类,通常表示严重的、不可恢复的问题。
Error 表示严重的问题,通常是虚拟机或系统级错误,程序无法恢复。
Exception 表示可以被捕获和处理的问题,分为受检查异常和未受检查异常,程序可以继续执行。
开发者通常需要捕获和处理受检查异常,而未受检查异常通常表示编程错误。
面向对象编程
1.面向对象的特征有哪些方面?
1. 封装
封装是将数据和方法封装在对象内部,以隐藏对象的实现细节,只暴露必要的接口。
2. 继承
继承是一种机制,允许一个类继承另一个类的属性和方法。
子类可以继承父类的特性,并实现代码重用,提高代码的重用性。
3. 多态
多态允许对象在不同上下文中表现出不同的行为,它基于方法重写和接口实现,使不同类的对象可以被一致地对待。
4. 抽象
抽象是将对象的共性特征提取成类和接口,以简化复杂性。
2.什么是抽象类?
抽象类是不能被实例化的类,通常用于作为其他类的基类,它可以包含抽象方法,需要由子类实现。
3.什么是接口?
接口是一种抽象数据类型,定义了一组方法签名,但没有具体实现。
类可以实现一个或多个接口,以获得接口定义的方法。
4.重载Overload和Override重写的区别?
方法重载:是指在同一个类中定义多个方法,具有相同名称但不同的参数列表(参数类型、参数数量或参数顺序不同)。
class Example { void print(int a) { System.out.println(a); } void print(double b) { System.out.println(b); } }
方法重写是指:子类定义一个与父类方法名称、参数列表相同的方法,用于替换父类中的方法实现。
class Parent { void display() { System.out.println("Parent class"); } } class Child extends Parent { void display() { System.out.println("Child class"); } }
总结:
- 重载涉及在同一类中创建具有相同名称但不同参数列表的多个方法,以提供更多选择。
- 重写涉及子类重写父类的方法,实现多态,子类的方法与父类方法具有相同的名称和参数列表。
5.abstract class和interface有什么区别?
抽象类是一个类,可以包含抽象方法和具体方法,它可以有成员变量。
抽象类使用 abstract
关键字声明,可以包含构造方法。
接口是一种特殊的抽象类型,只包含抽象方法和常量字段,没有方法体,类通过实现接口来获得接口定义的行为。
可以实现多接口,实现多重继承的效果,接口通常用于定义规范和行为的契约。
Java集合
1.Java集合框架有哪些?
Java集合框架,主要会包含:List、Map、Set、Queue等组成。
如下图所示:
2.List集合框架有哪些?
List接口常用的实现类有:ArrayList、LinkedList、Vector。
如下图所示:
3.Java集合常用Set?
Set接口常用的实现类有:HashSet、LinkedHashSet、TreeSet。
如下图所示:
4.Java集合常用的Map?
Java集合常用的Map,常见包含:HashMap、TreeMap、Hashtable等。
如下图所示:
备注:重点要掌握好HashMap。
5.HashMap的数据结构?
HashMap的数据结构:数组+链表+红黑树,JDK1.8增加了红黑树部分的数据结构。
如下图所示:
下面是 HashMap 的主要数据结构及相关信息:
数组(Array)
HashMap
内部使用数组来存储数据,数组的大小通常是一个质数,用于分散键值对。
桶(Bucket)
数组中的每个元素被称为一个桶,每个桶可以包含一个或多个键值对。
链表(Linked List)或红黑树(Red-Black Tree)
在 Java 8 及之后的版本中,当发生哈希冲突时,每个桶可以包含一个链表或红黑树,用于存储具有相同哈希码的键值对。
如果链表中的元素数量较少,通常使用链表来存储;当元素数量较多时,将链表转换为红黑树以提高性能。
6.HashMap1.8链表在什么时候转化成红黑树?
当数组的容量大于=64且链表长度大于8则会将链表转化成红黑树。
当红黑树的节点个数<6则将红黑树转换成链表。
7.HashMap与HashTable之间的区别?
HashMap 是非线程安全的,性能较高,允许键和值为 null。
HashTable 是线程安全的,性能较低,不允许键或值为 null。
推荐在单线程环境下使用 HashMap,在多线程环境下使用 ConcurrentHashMap,而不是 HashTable。
8.HashMap和ConcurrentHashMap的区别?
HashMap 是非线程安全的,性能较高,适用于单线程环境。
ConcurrentHashMap 是线程安全的,具有更好的并发性能,适用于多线程环境。
在需要线程安全的情况下,推荐使用 ConcurrentHashMap。在单线程环境中,使用 HashMap 通常更合适。
Java虚拟机
1.什么是JVM?
JVM是Java Virtual Machine(Java虚拟机)的缩写,JVM是一个虚构出来的计算机,有着自己完善的硬件架构,如处理器、堆栈等。
JVM是Java应用程序的运行时环境,它负责将Java字节码编译成本地机器代码,以便在不同平台上执行Java应用程序。
2.什么是字节码?
Java字节码是一种中间代码,它是Java编译器生成的,与特定平台无关。
JVM将字节码解释或编译成本地机器代码,以便在不同平台上运行Java应用程序。
3.为什么需要JVM?
Java语言使用Java虚拟机屏蔽了与具体平台相关的信息,使得Java语言编译程序只需生成在Java虚拟机上运行的目标代码(字节码),就可以在多种平台上不加修改地运行。
Java文件必须先通过一个叫javac的编译器,将代码编译成class文件,然后通过JVM把class文件解释成各个平台可以识别的机器码,最终实现跨平台运行代码。
4.JVM的主要组件是什么?
JVM有三个主要组件:类加载器、运行时数据区和执行引擎。
类加载器负责加载类文件,运行时数据区包括堆、方法区和Java栈,执行引擎执行字节码指令。
如下图所示:
5.什么是Java堆(Java Heap)?
Java堆是JVM运行时数据区的一部分,用于存储对象实例。
在 Java 中堆被划分成两个不同的区域:新生代 ( Young )、老年代 ( Old )。
新生代 ( Young ) 又被划分为三个区域:Eden、From Survivor、To Survivor。
如下图所示:
6.什么是方法区(Method Area)?
方法区是JVM运行时数据区的一部分,用于存储类信息、常量、静态变量和方法的字节码。
7.什么是Java栈(Java Stack)?
Java栈是JVM运行时数据区的一部分,用于存储方法调用和局部变量。
每个线程都有自己的Java栈,它用于跟踪方法调用的状态。
8.什么是类加载器(Class Loader)?
类加载器是JVM的一部分,负责加载类文件。
JVM有三种内置的类加载器:启动类加载器、扩展类加载器和应用程序类加载器,开发人员还可以自定义类加载器。
9.什么是垃圾回收?
垃圾回收是JVM的一项功能,用于自动回收不再使用的内存,以便释放资源和防止内存泄漏。
JVM使用不同的垃圾回收算法,如标记-清除、复制、标记-整理等来管理内存。
数据库
1.MySQL有哪些常见存储引擎?
MySQL 常见的存储引擎,可以使用
SHOW ENGINES
命令,来列出所有的存储引擎

2.数据库设计三大范式?
第一范式:确保每列保持原子性,所有字段值都是不可分解的原子值;
第二范式:确保表中的每列都和主键相关,一个表中只能保存一种数据,不可以把多种数据保存在同一张数据库表中;
第三范式:确保每列都和主键列直接相关,而不是间接相关;
3.请解释MySQL的体系结构?
MySQL的体系结构:包括客户端、连接池、查询解析器、查询缓存、存储引擎、表和索引,还有物理文件系统等组件。
如下图所示:
客户端通过连接池与服务器通信,查询解析器解析SQL查询,查询缓存可用于缓存查询结果,存储引擎负责数据的存储和检索。
4.MySQL事务的隔离级别?
数据库事务的隔离级别主要是四种:读未提交、读已提交、可重复读、串行化。
5.MySQL事务的四大特征?
原子性(Atomicity):所有操作,要么全部完成,要么全部不完成。
一致性(Correspondence):数据必须保证从一种一致性的状态,转换为另一种一致性状态。
隔离性(Isolation):指当多个用户并发操作数据库时,数据库为每一个用户开启不同的事务,这些事务之间相互不干扰,相互隔离。
持久性(Durability):事务一旦commit,则数据就会保存下来,即使提交完之后系统崩溃,数据也不会丢失。
6.如何优化MySQL查询性能?
MySQL查询性能优化涉及多方面,包括合适的索引设计、适当的SQL查询优化、缓存的使用、适时的表优化、分区和分片等策略。
7.常用的索引有哪些类型?
主要包含:
唯一索引:唯一索引不允许两行具有相同的索引值。
主键索引:为表定义一个主键将自动创建主键索引,主键索引是唯一索引的特殊类型。
聚集索引(Clustered):表中各行的物理顺序与键值的逻辑(索引)顺序相同,每个表只能有一个。
非聚集索引(Non-clustered):非聚集索引指定表的逻辑顺序。
8.MySQL主从复制模式有哪些?
MySQL主从复制模式主要会包含:异步复制、半同步、以及全同步复制三种复制模式。
Java开发框架
1.Spring框架?
Spring是一个开源的轻量级Java应用框架,用于构建企业级Java应用程序。
2.Spring框架功能模块有哪些?
Spring有七大功能模块,分别是Spring Core,AOP,ORM,DAO,MVC,WEB,Context。
3.怎么理解IOC?
IOC是Inversion of Control的缩写,多数书籍翻译成“控制反转”。
在传统的编程模型中,程序员需要在代码中显式地创建对象并指定对象之间的关系,这样耦合度比较高。
如下图所示:
通过IOC容器,对象的创建和关系管理得以解耦。
如下图所示:
通过这种方式,IOC容器使对象的创建与对象之间的关系从开发者代码中解脱出来,从而使得程序更加灵活、易于维护和扩展。
4.怎么理解AOP?
AOP (Aspect Orient Programming),直译过来就是 面向切面编程。
面向切面编程,实现在不修改源代码的情况下给程序动态统一添加额外功能的一种技术,如下图所示:
AOP可以拦截指定的方法并且对方法增强,比如:Spring的事务,通过事务的注解配置,Spring会自动在业务方法中开启、提交业务等策略。
5.什么是Spring Boot?
Spring Boot是Spring项目的子项目,用于简化Spring应用程序的开发和部署。
Spring Boot提供了自动配置、嵌入式Web服务器、外部化配置等功能,使应用程序更容易启动和运行。
6.什么是Spring Boot的自动配置?
Spring Boot的自动配置是一种机制,它根据应用程序的依赖和配置自动配置Spring应用程序。
这减少了开发人员的配置工作,使应用程序更容易启动。
7.什么是Hibernate框架?
Hibernate是一个开源的对象关系映射(ORM)框架,用于将Java对象与数据库表之间建立映射关系,从而方便数据库操作。
8.SpringBean的生命周期?
Spring中每个Bean的生命周期如下,主要分为以下8大步骤:
9.SpringBoot、Spring MVC和Spring有什么区别?
Spring:Spring最重要的特征是依赖注入,所有Spring Modules不是依赖注入就是IOC控制反转,可以开发松耦合应用。
Spring MVC:Spring MVC提供了一种分离式的方法来开发Web应用,通过运用MVC模式,开发 Web 应用将会变的非常简单。
SpringBoot:Spring和Spring MVC的问题在于需要配置大量的参数,SpringBoot通过一个自动配置和启动的项来解决这个问题。
10.SpringBoot 与 SpringCloud 区别?
SpringBoot 是快速开发的 Spring 框架,SpringCloud 是完整的微服务框架,SpringCloud 依赖于 SpringBoot。
Java中间件
1.什么是Java中间件?
Java中间件是一种软件或服务,用于连接、通信和协调分布式系统中的不同组件。
Java中间件有助于管理分布式系统的复杂性,提供了解耦和可伸缩性。
2.请列举一些常见的Java中间件?
常见的Java中间件包括:
- 消息队列(如 Kafka、RocketMQ、RabbitMQ);
- 分布式缓存(如Redis、Memcached);
- 分布式数据库(如Apache Cassandra、Hazelcast);
- 应用服务器(如Tomcat、WildFly);
- 以及微服务框架(如Spring Cloud)。
3.消息队列的使用场景?
消息队列用于处理异步任务、削峰填谷、事件驱动架构、日志记录、分布式通信等场景。
4.分布式缓存中间件?
分布式缓存中间件是一种基于 Java 技术的中间件,主要用于提供分布式缓存服务。
常见的分布式缓存有:Memcached、Redis、Ehcache 等。
5.数据库中间件?
数据库中间件可以简化对读写分离以及分库分表的操作,并隐藏底层实现细节,可以像操作单库单表那样操作多库多表。
一些常见的数据库中间件如下:
- MyCat:开源数据库中间件,目前更新了MyCat2版本;
- Atlas:Qihoo 360公司Web平台部基础架构团队开发维护的一个基于MySQL协议的数据中间层项目;
- tddl:阿里巴巴自主研发的分布式数据库服务;
- Sharding-JDBC:ShardingShpere的一个子产品,一个轻量级Java框架;
7.RPC 中间件有哪些?
RPC 中间件是一种基于 Java 技术的中间件,主要用于实现远程过程调用和服务治理。
常见的 Java RPC 中间件包括: Dubbo、gRPC、Thrift、Spring Cloud 、Spring Cloud Alibaba等。
8.什么是微服务?
微服务是一种架构模式,它提倡将单一应用程序划分成一组小的服务,服务之间采用轻量级的通信机制互相沟通。
目前国内企业使用的微服务框架主要有:Spring Cloud、Dubbo、Spring Cloud Alibaba、ServiceMesh。
mikechen
mikechen睿哥,10年+大厂架构经验,资深技术专家,就职于阿里巴巴、淘宝、百度等一线互联网大厂。
关注「mikechen」公众号,获取更多技术干货!

后台回复【架构】即可获取《阿里架构师进阶专题全部合集》,后台回复【面试】即可获取《史上最全阿里Java面试题总结》