網頁

2021/3/25

Java Set 加入重覆的元素不會取代原本的元素 set add duplicates not replace existed one

Java Set.add(E e)若加入的元素已經存在,則新的元素不會取代原本的。

例如ItemSet要的元素類別。注意覆寫的hashCode()equals()僅根據id來比較。

Item

package com.abc.demo;

import java.util.Objects;

public class Item {

    private long id;
    private int value;

    public Item(long id, int value) {
        this.id = id;
        this.value = value;
    }

    @Override
    public boolean equals(Object o) {
        if (this == o) return true;
        if (o == null || getClass() != o.getClass()) return false;
        Item item = (Item) o;
        return id == item.id;
    }

    @Override
    public int hashCode() {
        return Objects.hash(id);
    }

    @Override
    public String toString() {
        return "Item{id=" + id +", value=" + value + "}";
    }
}

依序加入兩個id相同但value值不同的Item物件,可以看到後面加入的元素並沒有覆蓋前面的元素。

package com.abc.demo;

import java.util.HashSet;
import java.util.Set;

public class Main {

    public static void main(String[] args) {

        Set<Item> set = new HashSet<>();
        set.add(new Item(1, 100));
        boolean update = set.add(new Item(1, 200));
        
        System.out.println(update); // false

        set.forEach(System.out::println); // Item{id=1, value=100}

    }

}

節錄Set.add(E e)API說明如下。

...If this set already contains the element, the call leaves the set unchanged and returns false.



沒有留言:

張貼留言