list - Why does not Java HashSet.equals() check for object equality? -
i've come phenomenon morning, equals method in set not check value equality of element while list does. not in accordance java doc.
set<myclass> s1 = new hashset<>(); set<myclass> s2 = new hashset<>(); set<myclass> s3 = new hashset<>(); set<myclass> s4 = new hashset<>(); list<myclass> l1 = new arraylist<>(); list<myclass> l2 = new arraylist<>(); myclass o1 = new myclass(); myclass o2 = new myclass(); // **this gives false, , not call myclass.equals().** s1.add(o1); s2.add(o2); boolean setcomparewithdifferentobjects = s1.equals(s2); // gives true, , not call myclass.equals(). s3.add(o1); s4.add(o1); boolean setcomparewithsaveobjects = s3.equals(s4); // give true, , myclass.equals() called. l1.add(o1); l2.add(o2); boolean listcompare = l1.equals(l2) i've done research. according java doc set, hashset equals , hashset containsall, hashset contains, use (o==null ? e==null : o.equals(e)) check whether elements equal. why happen? can give me hint on this?
thanks!
----------answer question can found here -----------
what issues should considered when overriding equals , hashcode in java?
i overrided equals() not hashcode()...
btw, same set comparison worked in groovy, if hashcode() not overriden.
hashset includes number of optimizations can explain of this: first, if 2 objects put different buckets hash codes, or if have different hash codes @ all, may skip equals call. allowed contract of object.hashcode; if 2 objects have different hash codes not allowed .equals each other.
for other case, hashset takes advantage of contract of .equals specifies if 2 objects == each other, must .equals each other. part of hashset's implementation here checks if elements ==, , if are, skips calling .equals.
if every method implements contract correctly, cannot change semantics; hashset behave if .equals being called.
Comments
Post a Comment