Java HashCode and Equals

Equals

在實現 equals 這個方法之前, 應該先想的是怎樣才算是相等?

先看個例子

http://openhome.cc/Gossip/JavaEssence/ObjectEquality.html

String s1 = new String("Java");
String s2 = new String("Java");
System.out.println(s1 == s2);       // 顯示 false
System.out.println(s1.equals(s2));  // 顯示 true

使用 Apache commons 可以協助更快的定義 entity 的差異, 比如說 Item(商品),
用商品的 uId 來定義是否相等。

文章建議, 在定義 equals() 的同時, 最好也定義 hashCode(),
這是兩件不同的事情, hashCode() 就像物件的身分證, 會更嚴格的處理物件身份的問題,
Collection 類的操作會常用到。

隨便的例子

package entitys;
import lombok.AllArgsConstructor;
import lombok.Data;
import org.apache.commons.lang3.builder.EqualsBuilder;
import org.apache.commons.lang3.builder.HashCodeBuilder;

/**
 * Created by jerry on 2017/9/22.
 */
@Data
@AllArgsConstructor
public class Apple {
    private String name;
    private String type;
    private String price;

    @Override
    public boolean equals(Object obj) {
        if (!(obj instanceof Apple)) {
            return false;
        }

        if(obj == this) {
            return true;
        }

        Apple other = (Apple) obj;
        return new EqualsBuilder()
                .append(this.getName(), other.getName())
                .isEquals();
    }

    @Override
    public int hashCode() {
        return new HashCodeBuilder(17, 31)  // two randomly chosen prime numbers
                .append(this.getName()) // if deriving: appendSuper(super.hashCode()).
                .append(this.getPrice())
                .toHashCode();
    }
}



    @Test
    public void test1() {
        Apple item1 = new Apple("apple", "fruit", "10");
        Apple item2 = new Apple("apple", "fruit", "15");
        Apple item3 = new Apple("pear", "fruit", "10");

        // 只要 name 屬性一樣, 就是 equal
        Assert.assertEquals(item1, item2);

        // 奧萊仔假朋個, 就不 equal
        Assert.assertFalse(item1.equals(item3));
    }


    @Test
    public void test2() {
        Set items = new HashSet<>();

        Apple item1 = new Apple("apple", "fruit-a", "10");
        Apple item2 = new Apple("apple", "fruit-b", "10");

        // 在購物車裡面放兩個, 不同 type 屬性的蘋果
        items.add(item1);
        items.add(item2);

        // 結果只有一顆, [Apple(name=apple, type=fruit-a, price=10)]
        System.out.println(items);
    }

沒有留言:

張貼留言