Did you know that :
Map<Object,Object> m1 = new HashMap<Object, Object>(); Map<Object,Object> m2 = new HashMap<Object, Object>(); System.out.println('m1.equals(m2) = '+m1.equals(m2)); System.out.println('m1.keySet().equals(m2.keySet()) = ' +m1.keySet().equals(m2.keySet())); System.out.println('m1.entrySet().equals(m2.entrySet()) = ' +m1.entrySet().equals(m2.entrySet())); System.out.println('m1.values().equals(m2.values()) = ' +m1.values().equals(m2.values()));
would output :
m1.equals(m2) = true m1.keySet().equals(m2.keySet()) = true m1.entrySet().equals(m2.entrySet()) = true m1.values().equals(m2.values()) = false
This is caused by the fact that AbstractCollection (which HashMap$Values inherits from) does not overrides #equals().
Do you have an idea why this is so ?
Per the contract of
Collection#equals(), there is no general-purpose equals() methods forCollections, and thusAbstractCollectioncannot provide one.Note that
HashMap$Valuesis neither a Set nor a List, thus the quandary and in a sense the reason it does not supportequals().