String、equals 与 hashCode
String 是不可变对象:对字符串“修改”的操作会产生新字符串。比较字符串内容必须使用 equals,不要使用 ==。
String a = new String("hello");
String b = new String("hello");
System.out.println(a == b); // false:比较引用
System.out.println(a.equals(b)); // true:比较内容
为避免 null 导致异常,可把已知非空的字面量放在左侧:
如果自定义类重写 equals,通常必须同时重写 hashCode。契约要求:两个对象若由 equals 判断相等,它们的 hashCode 必须相等;否则放入 HashSet 或作为 HashMap 键时会出现错误行为。
@Override
public boolean equals(Object other) { /* 按字段比较 */ }
@Override
public int hashCode() { /* 使用同一组字段 */ }
现代 Java 可使用 IDE 生成这些方法,生成后仍应确认参与比较的字段符合业务身份定义。