跳转至

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 导致异常,可把已知非空的字面量放在左侧:

boolean isAdmin = "admin".equals(role);

如果自定义类重写 equals,通常必须同时重写 hashCode。契约要求:两个对象若由 equals 判断相等,它们的 hashCode 必须相等;否则放入 HashSet 或作为 HashMap 键时会出现错误行为。

@Override
public boolean equals(Object other) { /* 按字段比较 */ }

@Override
public int hashCode() { /* 使用同一组字段 */ }

现代 Java 可使用 IDE 生成这些方法,生成后仍应确认参与比较的字段符合业务身份定义。

参考

评论