✅ 一、Java基础(详细版)
1. JDK 和 JRE 有什么区别?
✅ 本质区别
- **JDK(Java Development Kit)**是完整的Java软件开发工具包。
- **JRE(Java Runtime Environment)**只是运行Java程序所需的环境,不含编译器。
✅ 组成比较
比较项 |
JDK |
JRE |
是否包含 JRE |
✅ 是 |
自身 |
是否包含 JVM |
✅ |
✅ |
是否包含开发工具(javac, javadoc) |
✅ |
❌ |
适用人群 |
开发者 |
普通用户 |
✅ 示例:
安装JDK后可运行以下命令:
javac HelloWorld.java // 编译工具,仅JDK才有
java HelloWorld // JRE环境中的 JVM 执行
2. ==
和 equals()
的区别是什么?
✅ 原理:
操作符 |
比较内容 |
示例 |
== |
引用是否指向同一内存地址 |
比如两个new String() 返回不同对象 |
equals() |
对象内容是否相等(可重写) |
String.equals() 比较字符串值 |
✅ 示例分析:
String a = new String("hello");
String b = new String("hello");
System.out.println(a == b);
System.out.println(a.equals(b));
✅ 注意事项:
- 若未重写equals,行为与==一致(即默认比较引用)。
equals()
用于比较内容,需重写hashCode()
保持一致性。
3. 两个对象 hashCode() 相同,equals() 也一定为 true 吗?
❌ 不一定,原因是 hash 冲突可能发生。
✅ hashCode 和 equals 的关系:
- equals 返回 true → hashCode 必须相等
- hashCode 相等 → 不代表 equals 一定 true
✅ 示例代码(故意制造 hash 冲突):
class MyObj {
int val;
public MyObj(int val) { this.val = val; }
@Override
public int hashCode() {
return 42; // 固定值,模拟冲突
}
@Override
public boolean equals(Object o) {
return o instanceof MyObj && ((MyObj)o).val == this.val;
}
}
MyObj o1 = new MyObj(1);
MyObj o2 = new MyObj(2);
System.out.println(o1.hashCode() == o2.hashCode()); // true
System.out.println(o1.equals(o2)); // false
4. final 在 Java 中有什么作用?
✅ 使用场景:
修饰对象 |
含义 |
示例 |
final 变量 |
值一旦赋值后不可更改(常量) |
final int x = 10; |
final 方法 |
不能被子类重写 |
final void print() |
final 类 |
不能被继承 |
final class Math {} |
✅ 示例:
final int a = 10;
class Base {
final void show() {
System.out.println("final method");
}
}
final class Tool {
}
✅ 边界情况:
- final 变量必须在定义时或构造函数中初始化。
- final 变量引用对象后,对象内容仍可变(对引用不对值)。
final List<String> list = new ArrayList<>();
list.add("a");