import java.util.HashMap;
import java.util.HashSet;
import java.util.Map;
import java.util.Objects;
import java.util.Set;

class Buku {
    private final String isbn;

    public Buku(String isbn) {
        this.isbn = isbn;
    }

    @Override
    public boolean equals(Object obj) {
        if (!(obj instanceof Buku lain)) {
            return false;
        }
        return isbn.equals(lain.isbn);
    }

    // hashCode kini konsisten dengan equals: basisnya field yang sama.
    @Override
    public int hashCode() {
        return Objects.hash(isbn);
    }
}

public class SetDenganHashCode {
    public static void main(String[] args) {
        Buku a = new Buku("978-602-1234-01-5");
        Buku b = new Buku("978-602-1234-01-5");

        System.out.println("a.equals(b)                 : " + a.equals(b));
        System.out.println("a.hashCode() == b.hashCode(): "
                + (a.hashCode() == b.hashCode()));
        System.out.println("a.hashCode()                : " + a.hashCode());

        Set<Buku> rak = new HashSet<>();
        rak.add(a);
        System.out.println("rak.contains(b)             : " + rak.contains(b));

        rak.add(b);
        System.out.println("setelah add b, rak.size()   : " + rak.size());

        Map<Buku, String> lokasi = new HashMap<>();
        lokasi.put(a, "Rak A-1");
        System.out.println("lokasi.get(b)               : " + lokasi.get(b));
    }
}
