重寫equals()和hashCode()需要注意的地方。
看為啥會有問題。
private int rule_type; private String value; @Override public boolean equals(Object o) { if (this == o) return true;//指向同一個地址,引用相同,那就是同一個對象咯 if (!(o instanceof ClassName)) return false; ClassName that = (ClassName) o; return rule_type == that.getRule_type() && value.equals(that.getValue());//可能出空指針的地方各個屬性都相同了,說明也是一個同一個對象雖然地址不同 } @Override public int hashCode() { return Objects.hash(getRule_type(), getValue()); }
怎么解決:
Objects.equals(value, that.getValue());
why:
//看這個Objects.equals的源碼如下 public static boolean equals(Object a, Object b) { return (a == b) || (a != null && a.equals(b)); }
做了空判斷。
java 就是 天天的空指針啊。
總結:
用哪幾個屬性來區別判斷是不是相同的,就用哪幾個屬性來生成hashcode,
並且判斷2個對象是不是相同的條件就是這幾個屬性,只有,幾個屬性都相同的情況下,這2個對象就相等。
經過后來我看到guava包的時候,也看到了guava里面做了如下實現,發現上面的這個Objects.equals()方法是自 java 1.7才開始的,估計是借鑒guava的實現的吧。