Core JAVA: How does HashSet work internally? Implementation | Why are its elements unique?