in lang/java/avro/src/main/java/org/apache/avro/generic/GenericData.java [1205:1270]
protected int compareMaps(final Map<?, ?> m1, final Map<?, ?> m2) {
if (m1 == m2) {
return 0;
}
if (m1.isEmpty() && m2.isEmpty()) {
return 0;
}
if (m1.size() != m2.size()) {
return 1;
}
/**
* Peek at keys, assuming they're all the same type within a Map
*/
final Object key1 = m1.keySet().iterator().next();
final Object key2 = m2.keySet().iterator().next();
boolean utf8ToString = false;
boolean stringToUtf8 = false;
if (key1 instanceof Utf8 && key2 instanceof String) {
utf8ToString = true;
} else if (key1 instanceof String && key2 instanceof Utf8) {
stringToUtf8 = true;
}
try {
for (Map.Entry e : m1.entrySet()) {
final Object key = e.getKey();
Object lookupKey = key;
if (utf8ToString) {
lookupKey = key.toString();
} else if (stringToUtf8) {
lookupKey = new Utf8((String) lookupKey);
}
final Object value = e.getValue();
if (value == null) {
if (!(m2.get(lookupKey) == null && m2.containsKey(lookupKey))) {
return 1;
}
} else {
final Object value2 = m2.get(lookupKey);
if (value instanceof Utf8 && value2 instanceof String) {
if (!value.toString().equals(value2)) {
return 1;
}
} else if (value instanceof String && value2 instanceof Utf8) {
if (!new Utf8((String) value).equals(value2)) {
return 1;
}
} else {
if (!value.equals(value2)) {
return 1;
}
}
}
}
} catch (ClassCastException unused) {
return 1;
} catch (NullPointerException unused) {
return 1;
}
return 0;
}