Java SE 专业术语
基础概念
Java 由 Sun Microsystems 于 1995 年发布的面向对象编程语言,核心理念是"Write Once, Run Anywhere",通过 JVM 实现跨平台运行。
JDK(Java Development Kit) Java 开发工具包,包含 JRE + 编译器(javac)、打包工具(jar)、文档工具(javadoc)等开发工具。
JRE(Java Runtime Environment) Java 运行环境,包含 JVM 和核心类库,仅能运行 Java 程序不能编译。从 Java 11 起不再单独发布 JRE。
JVM(Java Virtual Machine) Java 虚拟机,执行编译后的字节码,负责内存管理、垃圾回收、线程调度和安全检查。
字节码(Bytecode) Java 源码经 javac 编译后生成的中间代码(.class 文件),由 JVM 解释或 JIT 编译执行,是跨平台的关键。
JIT(Just-In-Time Compiler) 即时编译器,将热点字节码直接编译为本地机器码以提升执行效率,是 JVM 性能优化的核心技术。
JSR(Java Specification Request) Java 规范请求,由 JCP(Java Community Process)管理的 Java 平台标准化提案,每个 JSR 对应一个规范编号。
LTS(Long-Term Support) 长期支持版本,由 Oracle 提供长达数年的安全更新和技术支持。当前 LTS 版本有 Java 8、11、17、21。
GC(Garbage Collection) 垃圾回收,JVM 自动管理内存的机制,回收不再使用的对象占用的内存空间。
面向对象编程(OOP)
OOP(Object-Oriented Programming) 以对象为基本单元的编程范式,通过封装、继承、多态、抽象四大特性组织代码,提升可维护性和复用性。
对象(Object) 现实世界中事物的抽象,具有状态(字段/属性)和行为(方法),是类的实例化结果。
类(Class) 对象的模板或蓝图,定义了对象应具有的属性和方法。
封装(Encapsulation) 将数据(字段)和操作数据的方法绑定在一个类中,通过访问控制(private/protected/public)隐藏内部实现细节,仅暴露必要的公共接口。
继承(Inheritance) 子类(派生类)自动拥有父类(基类)的属性和方法,通过 extends 关键字实现。Java 只支持单继承(一个类只能有一个直接父类)。
多态(Polymorphism) 同一行为在不同对象上表现出不同形式的能力。Java 通过方法重写(Override)和父类引用指向子类对象实现运行时多态。
抽象(Abstraction) 提取对象共性特征而忽略具体细节的过程。Java 通过抽象类(abstract class)和接口(interface)实现。
抽象类(Abstract Class) 用 abstract 修饰的类,不能被实例化,可以包含抽象方法(无方法体)和具体方法(有方法体),可以有构造方法和成员变量。
接口(Interface) 定义行为契约的引用类型,只包含方法签名(Java 8+ 新增 default 和 static 方法,Java 9+ 新增 private 方法)。一个类可以实现多个接口。
default 方法(Default Method) [JDK 8+] 接口中的默认方法,提供方法默认实现。允许在不破坏已有实现类的情况下向接口添加新方法。
函数式接口(Functional Interface) [JDK 8+] 只包含一个抽象方法的接口,可通过 @FunctionalInterface 注解标记。Lambda 表达式的目标类型必须是函数式接口。
修饰符(Modifier) 用于修改类、方法、变量定义的关键字。包括访问修饰符(private/default/protected/public)和非访问修饰符(static/final/abstract/synchronized/volatile/transient)。
this 引用当前对象的实例,用于区分成员变量和局部变量,或在构造方法中调用本类的其他构造方法。
super 引用父类对象的引用,用于调用父类构造方法(super(args))或访问被子类覆盖的父类方法/字段。
构造方法(Constructor) 与类同名的特殊方法,在对象创建时被调用,用于初始化对象的状态。如果没有显式定义,编译器会生成默认无参构造方法。
方法重载(Overload) 在同一个类中定义多个同名方法但参数列表不同(参数类型、数量或顺序不同),编译期静态绑定。
方法重写(Override) 子类重新定义从父类继承的方法,方法签名完全相同,访问修饰符不能更严格。运行期动态绑定,是实现多态的核心。
向上转型(Upcasting) 将子类对象赋值给父类引用,自动进行,是安全的。
向下转型(Downcasting) 将父类引用转换回子类类型,需要显式强制转换,不安全的(可能抛出 ClassCastException)。Java 16+ 支持 instanceof 模式匹配简化语法。
泛型
泛型(Generics) [JDK 5+] 参数化类型机制,使类、接口、方法在定义时使用类型参数,在编译期进行类型检查,避免 ClassCastException。
类型参数(Type Parameter) 泛型声明中的占位符,如 <T>、<E>、<K, V>,使用时替换为具体类型。
类型擦除(Type Erasure) Java 泛型的实现机制,编译后泛型类型信息被移除,所有类型参数被替换为边界类型或 Object,并在必要时插入强制类型转换。
通配符(Wildcard) 泛型中使用 ? 表示未知类型。<? extends T> 为上界通配符(可读不可写),<? super T> 为下界通配符(可写不可读)。
PECS 原则(Producer Extends, Consumer Super) 泛型通配符使用指南:如果参数化类型是生产者(提供数据),用 extends;如果是消费者(接收数据),用 super。
原始类型(Raw Type) 不带类型参数的泛型类或接口,如 List(而非 List<String>)。仅为向后兼容保留,不推荐使用。
不可具化类型(Non-Reifiable Type) 运行时类型信息比编译时少的类型,如 List<String>(擦除后只剩 List)。不能用于 instanceof 检查和创建泛型数组。
桥接方法(Bridge Method) 编译器为维持泛型多态性自动生成的方法,在类型擦除后保证子类方法正确覆盖父类方法。
集合框架
集合(Collection) 存储和管理一组对象的容器。Java 集合框架(Java Collections Framework)是 java.util 包下一套统一的数据结构体系。
Collection 接口 集合框架的根接口之一(另一个是 Map),代表一组对象的容器。子接口包括 List、Set、Queue。
List 有序集合,允许重复元素,可通过索引访问。主要实现:ArrayList、LinkedList。
Set 不允许重复元素的集合,其判重依据 equals() 和 hashCode() 方法。主要实现:HashSet、TreeSet、LinkedHashSet。
Map 键值对映射结构,键不可重复,每个键最多映射一个值。主要实现:HashMap、TreeMap、LinkedHashMap、ConcurrentHashMap。
Queue / Deque 队列(先进先出)和双端队列(两端均可进出)。主要实现:ArrayDeque、PriorityQueue、LinkedList。
ArrayList 基于动态数组的 List 实现,随机访问 O(1),增删(非尾部)O(n),默认容量 10,扩容为 1.5 倍。最常用的 List 实现。
LinkedList 基于双向链表的 List 和 Deque 实现,随机访问 O(n),头尾增删 O(1)。
HashMap 基于哈希表的 Map 实现,JDK 8+ 采用数组+链表+红黑树结构。默认容量 16,负载因子 0.75,扩容为 2 倍。非线程安全。
紅黑树(Red-Black Tree) 自平衡二叉查找树,HashMap 在链表长度 ≥ 8 且数组长度 ≥ 64 时将链表转为红黑树,将查找复杂度从 O(n) 优化为 O(log n)。
TreeMap 基于红黑树的 Map 实现,键按自然顺序或指定 Comparator 排序。不允许 null 键。
LinkedHashMap HashMap 的子类,内部维护双向链表记录插入顺序或访问顺序(accessOrder 模式常用于 LRU 缓存)。
ConcurrentHashMap [JDK 5+] 线程安全的 HashMap。JDK 7 使用分段锁(Segment),JDK 8 改用 CAS + synchronized 锁单个桶节点,支持更高并发度。
Collections 工具类 提供对集合的静态操作工具方法,如排序(sort)、查找(binarySearch)、反转(reverse)、同步包装(synchronizedXXX)、不可变包装(unmodifiableXXX)。
Comparable 接口 自然排序接口,类的 compareTo() 方法定义默认排序规则。Collections.sort(list) 依赖此接口。
Comparator 接口 定制排序接口,compare() 方法定义外部比较规则。可与 Lambda 表达式结合使用 [JDK 8+]。
不可变集合(Immutable Collection) [JDK 9+] 通过 List.of()、Set.of()、Map.of() 创建的不可修改集合,不允许 null 元素。
异常处理
Throwable Java 异常体系的根类,所有错误和异常的父类。子类有 Error 和 Exception。
Exception 应用可以捕获并处理的异常。分为受检异常(Checked Exception)和非受检异常(RuntimeException)。
Error JVM 级别的严重错误(如 OutOfMemoryError、StackOverflowError),程序不应尝试捕获处理。
受检异常(Checked Exception) 编译期强制处理的异常(try-catch 或 throws 声明),如 IOException、SQLException。代表可恢复的外部条件。
运行时异常(RuntimeException / Unchecked Exception) 程序逻辑错误导致的异常,编译期不强制处理,如 NullPointerException、ArrayIndexOutOfBoundsException。
try-catch-finally Java 异常处理的核心结构。try 块包含可能抛出异常的代码,catch 块捕获并处理特定类型异常,finally 块中的代码无论是否异常都会执行。
try-with-resources [JDK 7+] 自动资源管理语法,在 try 后的括号中声明实现了 AutoCloseable 接口的资源,代码块结束后自动调用 close() 方法。
throws 方法声明中使用的关键字,表明该方法可能抛出指定类型的异常,由调用者负责处理。
throw 在代码中显式抛出异常对象的关键字。
I/O 流
流(Stream) 数据传输的抽象,代表一系列有序的数据。Java I/O 中分为字节流和字符流。
字节流(Byte Stream) 以字节(8 bit)为单位处理数据的 I/O 流,基类为 InputStream 和 OutputStream。用于处理二进制数据(图片、视频等)。
字符流(Character Stream) 以字符(16 bit Unicode)为单位处理数据的 I/O 流,基类为 Reader 和 Writer。用于处理文本数据,自动处理字符编码。
缓冲流(Buffered Stream) 在内存中维护缓冲区的 I/O 流,减少直接与磁盘/网络交互的次数,显著提升性能。如 BufferedReader、BufferedWriter。
转换流(Conversion Stream) 字节流到字符流的桥梁。InputStreamReader 将字节输入流转为字符输入流;OutputStreamWriter 反之。
序列化(Serialization) 将对象状态转换为字节序列的过程,通过实现 Serializable 接口标记可序列化类。
反序列化(Deserialization) 将字节序列还原为对象的过程。反序列化时不调用构造方法。
transient 修饰字段的关键字,标记该字段不参与序列化。
serialVersionUID 序列化版本号,用于验证序列化和反序列化时类的兼容性。不显式声明时编译器自动生成。
NIO(New I/O) [JDK 1.4+] 非阻塞 I/O 框架,引入 Channel(通道)、Buffer(缓冲区)、Selector(选择器),支持非阻塞网络 I/O。
NIO.2 [JDK 7+] 对 NIO 的扩展,引入 Path 接口(替代 File)、Files 工具类、文件系统监听(WatchService)、异步 I/O。
多线程与并发
进程(Process) 操作系统资源分配的基本单位,拥有独立的内存空间。进程间通信(IPC)开销较大。
线程(Thread) CPU 调度的最小单位,同一进程内的线程共享堆内存和方法区,每个线程有独立的栈和程序计数器。
并发(Concurrency) 多个线程在宏观上同时执行(时间片轮转),微观上可能是交替执行的。
并行(Parallelism) 多个线程在微观上同时执行(多核 CPU 每个核各跑一个线程)。
synchronized Java 内置的互斥同步关键字,可修饰方法或代码块,基于 JVM 的监视器锁(Monitor)实现。JDK 6 后经过偏向锁、轻量级锁等大量优化。
volatile 轻量级同步关键字,保证变量的内存可见性和禁止指令重排序,但不保证原子性。
Lock [JDK 5+]java.util.concurrent.locks 包中的接口,主要实现 ReentrantLock。与 synchronized 相比,支持可中断获取、尝试非阻塞获取、超时获取、公平锁。
CAS(Compare And Swap) 比较并交换,无锁乐观并发算法。通过 CPU 原子指令实现。Java 中通过 Unsafe 类和 AtomicXXX 原子类提供。
ABA 问题 CAS 的问题之一:一个值从 A 变为 B 再变回 A,CAS 检测时认为值未变化。通过版本号(AtomicStampedReference)解决。
线程池(ThreadPool) [JDK 5+] 复用线程的机制,通过 ExecutorService / ThreadPoolExecutor 管理线程的创建、复用和销毁,避免频繁创建线程的开销。
ThreadLocal 线程本地变量,为每个使用该变量的线程提供独立的副本。常用于数据库连接、Session 管理。必须调用 remove() 防止内存泄漏。
CountDownLatch [JDK 5+] 同步辅助类,允许一个或多个线程等待直到在其他线程中执行的一组操作完成(计数器归零)。
CyclicBarrier [JDK 5+] 同步辅助类,允许一组线程相互等待直到所有线程都到达一个公共屏障点,然后同时继续执行,可重复使用。
Semaphore [JDK 5+] 信号量,控制同时访问特定资源的线程数量,常用于限流。
BlockingQueue [JDK 5+] 阻塞队列,支持生产者-消费者模式。put/take 操作在队列满/空时阻塞。
虚拟线程(Virtual Thread) [JDK 21 正式] Project Loom 引入的轻量级用户态线程,由 JVM 调度而非 OS 调度,创建成本极低,适合高并发 I/O 密集型任务。
结构化并发(Structured Concurrency) [JDK 21 预览] 将一组相关的并发任务视为一个工作单元,任务间具有清晰的生命周期关系,一个任务失败可取消同组其他任务。
竞态条件(Race Condition) 多个线程同时访问共享数据且至少有一个线程在修改数据,导致结果依赖于线程执行时序的不确定性。
死锁(Deadlock) 两个或多个线程相互持有对方需要的锁资源而无限期等待的现象。
线程安全(Thread Safety) 类或方法在多线程环境下能正确运行,不需要调用方额外的同步措施。
JVM 与内存管理
堆(Heap) JVM 管理的最大内存区域,所有线程共享,用于存放对象实例和数组。是 GC 的主要作用区域。
虚拟机栈(Java Virtual Machine Stack) 线程私有的内存区域,每个方法调用对应一个栈帧,存放局部变量表、操作数栈、方法出口等。生命周期与线程相同。
元空间(MetaSpace) [JDK 8+] 取代永久代(PermGen)的线程共享区域,存储在本地内存中,存放类的元信息、运行时常量池、静态变量。
永久代(PermGen) [JDK 7 及之前] 方法区的一种实现,JVM 内存中固定大小的区域。JDK 8 起被元空间取代。
栈帧(Stack Frame) 虚拟机栈中的基本单元,每个方法调用对应一个栈帧的入栈和出栈。包含局部变量表、操作数栈、动态链接、方法返回地址。
程序计数器(Program Counter Register) 线程私有的内存区域,记录当前线程正在执行的字节码指令地址。不会出现 OOM。
GC Roots 可达性分析算法的起点集合,包括虚拟机栈中引用的对象、静态变量引用的对象、常量池引用的对象、JNI 引用的对象。
可达性分析(Reachability Analysis) 从 GC Roots 出发沿着引用链搜索,不可达的对象被判定为可回收。是 Java 主流 GC 的判断存活算法。
标记-清除(Mark-Sweep) 垃圾回收算法,先标记所有存活对象,然后清除未标记的对象。缺点是产生内存碎片。
标记-复制(Mark-Copy) 垃圾回收算法,将存活对象复制到新区域,然后清空原区域。无碎片但浪费一半内存,适用于新生代。
标记-整理(Mark-Compact) 垃圾回收算法,将存活对象向一端移动,然后清理边界外的内存。无碎片但移动成本高,适用于老年代。
STW(Stop-The-World) 垃圾回收时暂停所有用户线程的现象。GC 算法的核心优化目标之一是减少 STW 时间。
新生代(Young Generation) 堆中存放新创建对象的区域,包括 Eden 区和两个 Survivor 区。发生 Minor GC,频率高,速度快。
老年代(Old Generation) 堆中存放长期存活对象的区域,对象从新生代熬过多次 GC 后晋升到老年代。发生 Major GC / Full GC,频率低,耗时长。
G1(Garbage-First Garbage Collector) [JDK 7+,JDK 9+ 默认] 区域化分代垃圾回收器,将堆划分为大小相等的 Region,优先回收垃圾最多的区域,可设置预期停顿时间。
ZGC(Z Garbage Collector) [JDK 11+ 实验,JDK 15 正式] 超低延迟垃圾回收器,使用染色指针技术,目标停顿时间低于 1ms,支持 TB 级堆。
类加载器(ClassLoader) 负责将类的字节码加载到 JVM 中,生成 Class 对象。Java 使用双亲委派模型。
双亲委派模型(Parent Delegation Model) 类加载器在加载类时先委托父加载器查找,防止核心类被篡改,保证类型安全。
JNI(Java Native Interface) Java 本地接口,允许 Java 代码调用本地方法(通常用 C/C++ 写的动态库)。
反射与注解
反射(Reflection) 运行时动态获取类信息(Class 对象)、创建对象、调用方法、访问字段的机制。是框架(Spring、MyBatis)的核心基础。
Class 对象 JVM 为每个加载的类创建的 java.lang.Class 实例,包含类的完整结构信息,是反射的入口。
注解(Annotation) [JDK 5+] 为代码元素(类、方法、字段、参数等)添加元数据的标记,可在编译期或运行时通过反射读取。
元注解(Meta-Annotation) 用于修饰其他注解的注解,如 @Target(指定注解适用位置)、@Retention(指定保留策略)。
@Retention 指定注解的保留级别:SOURCE(源码,编译时丢弃)、CLASS(字节码,运行时不可获取)、RUNTIME(运行时可通过反射获取)。
Lambda 与 Stream
Lambda 表达式 [JDK 8+] 匿名函数的简洁写法,(参数) -> { 方法体 }。本质是函数式接口的实例,使 Java 支持函数式编程风格。
方法引用(Method Reference) [JDK 8+] Lambda 的进一步简化写法,ClassName::methodName。包括静态方法引用、实例方法引用、构造方法引用。
Stream API [JDK 8+] 函数式数据处理抽象,支持链式调用和惰性求值。操作分为中间操作(map/filter/sorted)和终端操作(collect/forEach/reduce)。
Optional [JDK 8+] 空值安全的容器类,鼓励显式处理 null 情况,减少 NullPointerException。提供 orElse()、ifPresent()、map() 等安全操作。
CompletableFuture [JDK 8+] 异步编程工具类,实现 Future 和 CompletionStage 接口,支持异步任务编排、回调、组合、异常处理。
新版本特性相关术语
var 类型推断 [JDK 10+] 局部变量类型推断关键字,编译器根据初始化表达式自动推断变量类型。仅用于局部变量,不能用于成员变量、方法参数和返回类型。
Record(记录类) [JDK 14 预览,JDK 16 正式] 不可变数据载体,自动生成构造方法、equals/hashCode/toString 和访问器方法。适用于数据传输对象(DTO)。
Sealed Class(密封类) [JDK 17 正式] 限制哪些类可以继承或实现当前类/接口,通过 permits 关键字声明允许的子类,增强类型系统的安全性。
Switch 表达式 [JDK 14 正式] 增强的 switch 语句,支持箭头语法(->)和返回值,可作为表达式使用。
模式匹配(Pattern Matching) [JDK 16+(instanceof)/ JDK 21+(switch 正式)] 在类型检查的同时自动完成类型转换和变量绑定,简化代码。instanceof 模式匹配(Java 16 正式),Switch 模式匹配(Java 21 正式)。
文本块(Text Block) [JDK 13 预览,JDK 15 正式] 多行字符串字面量,用 """...""" 包裹,自动处理缩进和换行,简化 SQL、JSON、HTML 等多行文本的编写。
模块化(Module System / Project Jigsaw) [JDK 9+] 将 JDK 本身和应用程序拆分为模块(module),通过 module-info.java 声明模块依赖和暴露的包,提升封装性和可维护性。
HTTP Client [JDK 11 正式] 全新的 HTTP 客户端 API(java.net.http),支持 HTTP/2 和 WebSocket,提供同步/异步两种调用方式。
其他重要术语
自动装箱(Autoboxing)与拆箱(Unboxing) [JDK 5+] 自动装箱:编译器将基本类型自动转换为对应的包装类;自动拆箱:反之。依赖 valueOf() 和 xxxValue() 方法。
String 常量池(String Pool) JVM 在堆中维护的 String 对象池。使用字面量 "abc" 创建的字符串自动存入池中,相同字面量复用同一对象。
intern() String 方法,将字符串放入常量池(如果池中不存在),返回池中的引用。
final 修饰类时该类不能被继承;修饰方法时该方法不能被子类重写;修饰变量时该变量只能被赋值一次(基本类型值不可变,引用类型地址不可变)。
static 静态修饰符。修饰成员变量为类变量(所有实例共享);修饰方法为类方法(可直接通过类名调用,不能访问实例成员);修饰代码块为静态初始化块(类加载时执行一次)。
equals() 与 hashCode() 契约 如果两个对象 equals() 返回 true,则它们的 hashCode() 返回值必须相等。反之不然(哈希冲突)。重写 equals() 必须同时重写 hashCode()。
深拷贝(Deep Copy)与浅拷贝(Shallow Copy) 浅拷贝:复制对象本身,但引用类型字段仍指向原对象的同一对象。深拷贝:复制对象及其引用的所有对象,完全独立。
不可变类(Immutable Class) 对象创建后状态不可修改的类。典型代表:String、基本类型包装类、BigInteger、LocalDate。要求:类 final、字段 private final、无 setter、getter 返回引用类型时做防御性拷贝。
SPI(Service Provider Interface) [JDK 6+] 服务提供者接口,Java 的扩展机制。通过在 META-INF/services/ 目录下配置实现类,运行时通过 ServiceLoader 加载。
JShell [JDK 9+] Java 的交互式编程环境(REPL),支持快速编写和测试代码片段,无需创建完整类文件。
版本说明:本术语表以 Java SE 8 为基础,标注
[JDK x+]的术语表示从该版本开始引入。当前最新 LTS 为 Java 21。