JDK、JRE、JVM 是层层包含关系:JDK 包含 JRE 和开发工具(如 javac),JRE 包含 JVM 和核心类库,JVM 是执行字节码的引擎,实现跨平台运行。

Java 基础面试题全面解析,关键不是背答案,而是理清底层逻辑和常见误区。
JDK、JRE 和 JVM 的关系要画清楚
JDK 是给开发者用的,含编译器(javac)、调试工具和 JRE;JRE 是给用户用的,只含运行环境(JVM + 类库);JVM 是真正执行字节码的引擎,负责跨平台——同一份 .class 文件,在 Windows、Linux 或 Mac 上靠各自的 JVM 运行,不用改代码。
== 和 equals 不是“快慢之分”,而是语义不同
-
==比较的是“是不是同一个东西”:基本类型比值,引用类型比内存地址。 -
equals()默认行为和==一样,但像String、Integer等都重写了它,用来判断“内容是否相等”。
⚠️ 注意:自己写的类如果要用equals比内容,必须重写equals(),且通常也要重写hashCode(),否则放进HashSet或当HashMap键时会出问题。
hashCode() 相同 ≠ equals() 为 true
这是哈希表设计决定的:哈希码只是快速分组的依据,不同对象完全可能算出相同哈希值(哈希冲突)。比如 Integer.valueOf(1) 和 Integer.valueOf(129) 在某些 JVM 实现里哈希码可能碰巧一样,但它们显然不等于彼此。反过来,equals() == true 时,hashCode() 必须相同——这是硬性约定。
基本类型和引用类型的内存行为影响实际编码
在 Java 中初始化和管理阿里云 SDK客户端。包括单例模式、线程安全、endpoint 与 region 配置、VPC 终端节点、同步与异步等。
-
int a = 10;→ 值直接存在栈里,复制就是拷贝数值。 -
String s = new String("abc");→ 栈里存的是指向堆中对象的地址,复制变量只是复制这个地址,两个变量仍指向同一块堆内存(除非你用new强制新建)。 -
String s1 = "abc"; String s2 = "abc";→ 这俩通常指向字符串常量池里的同一个对象,所以s1 == s2为true;但new String("abc") == "abc"一定是false。
final 的作用分三层,不能只记“不可变”
立即学习“Java免费学习笔记(深入)”;
- 修饰变量:基本类型值不可改;引用类型不能指向新对象(但对象内部状态仍可变)。
- 修饰方法:子类不能重写,常用于模板方法或防止破坏契约。
- 修饰类:不能被继承,如
String、Integer,保证行为稳定和安全性。
理解这些点,面试时哪怕被追问“为什么 String 要设为 final”或“HashMap 为什么要求 hashCode 和 equals 一致”,也能顺着逻辑讲清楚。

















