lab4a

处理下面这种情况:

比如我们提交了 lab1 对 Collatz.java 的修改 commit,然后远程仓库更新了一个 commit,但仍然包含旧的 Collatz.java。

此时我们 git pull 就会冲突。

lab4b

git checkout <commit-id>

进入 detached HEAD 状态,此时可以查看文件历史,但不要做任何修改。

git checkout master

回到 master 分支。

# 从某个提交或分支中恢复特定文件
git checkout branch-name -- file-name
git checkout commit-hash -- file-name

A Debugging Mystery

这个问题是因为 Java 中 Integer 对象的缓存机制导致的。

在 Java 中,== 运算符比较的是对象的引用(内存地址),而不是对象的值。当你使用 == 比较两个 Integer 对象时,你实际上是在比较它们是否是同一个对象实例。

Java 为了优化性能,对于范围在 -128 到 127 之间的整数,会预先缓存对应的 Integer 对象。这意味着:

  • 当你创建值在 -128 到 127 范围内的 Integer 对象时,Java 会返回缓存中的对象
  • 当值超出这个范围时(如 128),每次创建都会生成新的对象实例

因此,当你比较两个超出这个范围的 Integer 对象时,它们是不同的对象实例,== 运算符返回 false。

Integer a = 127;
Integer b = 127;
a == b;  // 返回 true,因为 a 和 b 引用同一个缓存对象

Integer c = 128;
Integer d = 128;
c == d;  // 返回 false,因为 c 和 d 是不同的对象实例

所以要比较两个 integer 大小,需要使用 equals 方法。

public static boolean isSameNumber(Integer a, Integer b) {
    return a.equals(b);
}