Java SE 面试题
基本知识
-
请简要介绍 Java SE。
Java SE (Java Standard Edition) 是 Java 平台的基础版本,提供 Java 开发所需的所有核心功能。它包括 Java 语言规范、Java 虚拟机规范和 Java 类库。
-
请解释 Java 的垃圾回收机制。
Java 的垃圾回收机制是自动内存管理的一部分,用于在堆内存中自动回收不再使用的对象。垃圾收集器会找出不再使用的对象,释放它们占用的内存,以便其他新对象使用。
-
请解释 Java 中的访问修饰符。
Java 有四种访问修饰符:public、private、protected 和默认(无修饰符)。这些修饰符用于限制类、方法和变量的访问权限。
面向对象
-
请解释封装、继承和多态。
- 封装:封装是将数据(变量)和操作数据的方法(函数)包装在一个类中的过程。它提供了一种隐藏实现细节并保护数据的方法。
- 继承:继承是子类从父类继承属性和方法的过程。子类可以重写或扩展父类的方法。
- 多态:多态是指同一操作作用于不同类型的对象时,可以有不同的行为。Java 中的多态是通过方法重写和接口实现来实现的。
-
请解释接口和抽象类的区别。
- 接口:接口是一个完全抽象的类,用于定义一组方法签名。实现接口的类需要实现接口中的所有方法。接口支持多实现。
- 抽象类:抽象类是不能实例化的类,可以包含抽象方法和具体方法。抽象方法需要子类提供实现。抽象类支持单继承。
集合框架
-
请解释 ArrayList 和 LinkedList 的区别。
- ArrayList:ArrayList 是基于动态数组实现的列表,支持随机访问。它的插入和删除操作性能较低,因为需要移动元素以保持连续性。
- LinkedList:LinkedList 是基于双向链表实现的列表,支持顺序访问。它的插入和删除操作性能较高,但随机访问性能较低。
-
请解释 Set 和 Map 接口。
- Set:Set 是一个不包含重复元素的集合。它可以用于存储独特的元素,并对它们进行操作,如添加、删除、查找等。
- Map:Map 是一个键值对的集合。它允许使用唯一的键存储和检索值。Map 的实现可以是有序的,如 TreeMap,或无序的,如 HashMap。
异常处理
-
请解释 Java 中的异常处理。
异常处理是 Java 中一种处理运行时错误和异常情况的机制。Java 使用 try、catch 和 finally 代码块来处理异常。当程序中发生异常时,程序会跳到相应的 catch 代码块来处理异常。finally 代码块在异常处理完成后执行,无论是否发生异常。
-
请解释受检异常和非受检异常的区别。
- 受检异常:受检异常是编译器在编译时要求处理(捕获或声明抛出)的异常。例如,IOException 和 SQLException。
- 非受检异常:非受检异常是运行时异常,编译器不强制要求处理。例如,NullPointerException 和 ArithmeticException。
并发编程
-
请解释 Java 中的线程和进程。
- 进程:进程是操作系统分配资源和调度执行的独立单位。每个进程都有自己的内存空间和系统资源。
- 线程:线程是进程中的执行单元。一个进程可以包含多个线程,它们共享进程的资源并行执行。
-
请解释 synchronized 关键字的作用。
synchronized 关键字用于实现线程同步。它可以修饰方法或代码块,确保同
Java 基本类型和包装类
- 解释 Java 中的基本数据类型及其大小和默认值。
Java 有 8 种基本数据类型:
byte
(8 位,默认值 0)、short
(16 位,默认值 0)、int
(32 位,默认值 0)、long
(64 位,默认值 0L)、float
(32 位,默认值 0.0f)、double
(64 位,默认值 0.0d)、char
(16 位,默认值 ‘\u0000’)和boolean
(1 位,默认值false
)。
- 说明自动装箱和自动拆箱。
自动装箱是将基本数据类型自动转换为对应的包装类对象的过程。例如,将
int
转换为Integer
。自动拆箱是将包装类对象自动转换为对应的基本数据类型的过程。例如,将Integer
转换为int
。自动装箱和拆箱是在Java 5引入的功能,用以简化基本数据类型与包装类之间的转换操作。
- 解释为什么推荐使用包装类而非基本数据类型。
推荐使用包装类的原因有以下几点:
- 包装类提供了更丰富的方法和属性,方便对数据进行操作。
- 包装类支持
null
值,有助于表示未初始化或缺失的值。 - 使用包装类可以将数据与对象的特性结合,使得程序更具面向对象特性。
字符串
- 请解释 String、StringBuilder 和 StringBuffer 的区别。
- String:String 类的对象是不可变的,一旦创建就不能改变。对字符串进行操作时,会产生新的字符串对象。频繁操作字符串可能导致性能下降和内存浪费。
- StringBuilder:StringBuilder 是一个可变字符串类,对字符串进行操作时,不会创建新的对象。它是线程不安全的,但在单线程环境中性能较高。
- StringBuffer:StringBuffer 与 StringBuilder 类似,也是一个可变字符串类。不同之处在于,StringBuffer 是线程安全的,可以在多线程环境中使用,但性能略低于 StringBuilder。
泛型
- 解释什么是泛型,以及它的作用。
泛型是Java中一种参数化类型的机制,允许在编译时定义和检查集合或其他对象的类型。泛型的作用主要有两点:
- 类型安全:泛型提供了编译时类型检查,避免了在运行时出现类型转换异常。
- 代码重用:泛型使得类和方法能够处理多种类型的数据,减少了代码重复。
输入输出 (I/O)
- 请简要描述 Java 中的字节流和字符流。
-
字节流:字节流用于处理原始二进制数据,如图像、音频等。字节流的两个基类是
InputStream
和OutputStream
。 -
字符流:字符流用于处理文本数据。字符流的两个基类是
Reader
和Writer
。字符流在处理字符数据时,会自动处理字符编码转换。
反射
- 请解释 Java 反射的概念及其用途。
Java 反射是一种动态获取和操作类、对象、方法和属性的信息的机制。通过反射,可以在运行时获取类的信息、创建对象、调用方法和访问属性。反射的用途包括:
- 动态加载和使用类,如插件系统。
- 实现通用的对象操作,如序列化和克隆。
- 在运行时检查和修改类的结构和行为,如框架和库的实现。
注解
- 请解释 Java 注解的概念及其用途。
Java 注解是一种为类、方法、属性或参数提供元数据的机制。注解在编译时或运行时可以被读取,用于改变代码的行为或生成额外的代码。注解的用途包括:
- 配置框架和库的行为,如 Spring 和 Hibernate。
- 自动生成代码,如 Lombok 和 Java Persistence API。
- 实现编译时检查和验证,如
@Override
和@SuppressWarnings
。
Java 内存模型
- 请描述 Java 内存模型的基本结构。
Java 内存模型主要包括堆、栈、方法区和本地方法栈。
- 堆:堆是用于存储对象实例的内存区域,所有线程共享。垃圾回收器负责回收堆中不再使用的对象。
- 栈:栈是用于存储局部变量和方法调用的内存区域。每个线程有一个独立的栈,存储着线程执行过程中的局部变量和方法调用信息。
- 方法区:方法区存储类的元数据、常量和静态变量。所有线程共享。
- 本地方法栈:本地方法栈用于存储本地方法(例如JNI调用)的相关信息。
序列化
- 请解释 Java 序列化的概念及其用途。
Java 序列化是将对象的状态(属性)转换为字节流的过程,以便将其存储在文件、数据库或通过网络传输。反序列化是将字节流重新转换为对象的过程。序列化的用途包括:
- 持久化:将对象状态保存到文件、数据库等存储介质中。
- 传输:通过网络将对象从一个应用传输到另一个应用。
- 克隆:通过序列化和反序列化实现对象的深度克隆。
Java 8 新特性
- 请解释 Java 8 中的 Lambda 表达式。
Lambda 表达式是 Java 8 引入的一种简洁的表示匿名函数的方法。Lambda 表达式可以用于实现函数式接口,即只包含一个抽象方法的接口。Lambda 表达式使得编写简洁的代码变得更容易,特别是在处理集合和并行编程时。
- 请解释 Java 8 中的 Stream API。
Java 8 的 Stream API 是一种用于处理集合的新方式。它允许以声明式和函数式的方式对集合进行操作,如过滤、映射、排序和聚合。Stream API 支持并行处理,可以有效地利用多核处理器,提高性能。
Java 9 新特性
- 请解释 Java 9 中的模块系统。
Java 9 引入了模块系统,称为 Jigsaw 项目。模块系统允许将代码分割成更小、更易于管理的模块。每个模块可以定义它所依赖的其他模块以及暴露给其他模块的接口。模块系统有助于提高代码的可维护性、封装性和可重用性。文章来源:https://www.toymoban.com/news/detail-429815.html
Java 11 新特性
- 请简要介绍 Java 11 中的新特性。
Java 11 是一个长期支持版本(LTS),引入了一些新特性,如:文章来源地址https://www.toymoban.com/news/detail-429815.html
- 局部变量类型推断的扩展:可以在 lambda 表达式的形式参数中使用
var
。 - 新的垃圾回收器 ZGC:一个低延迟、可扩展的垃圾回收器。
- 新的 HTTP 客户端 API:一个现代化的、支持 HTTP/2 和 WebSocket 的 HTTP 客户端 API。
- 删除了一些过时的 API 和功能。
到了这里,关于Java SE 面试题的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!