Assume three objects a,b,c with
a == a, b == b, c == c (reflexive)
a == b, b == a
b == c, c == b
a != c, c != a
(Pseudocode, x == y
stands for x.equals(y)
).
Now, let's add the objects to a set:
Set s = new HashSet(); // Set implementation doesn't matter
s.add(b); // s = [b]
s.add(a); // s doesn't change, because a == b
s.add(c); // s doesn't change, because c == b
In contrast, if we were to add them in a different order:
Set s = new HashSet();
s.add(a); // s = [a]
s.add(b); // s doesn't change, because b == a
s.add(c); // s = [a,c], because c != a
That is clearly counter-intuitive and doesn't match the behavior one would expect of a set. For example, it would mean that the union of two sets (i.e. the state of s after s.addAll(someOtherSet)
) could depend on the implementation (order of elements) of someOtherSet.
与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…