import java.util.*;
class Example {
public static void main
(String[] args
) { Set<String> identityA = newIdentityHashSet();
Set<String> identityB = newIdentityHashSet();
identityA.add("X");
identityB.
add(new String("X"));
System.
out.
println("This should be [X, X]:"); System.
out.
println(" " + unionInHashSet
(identityA, identityB
));
System.
out.
println("Returning an identity hash set solves this:"); System.
out.
println(" " + unionInIdentityHashSet
(identityA, identityB
));
Set<String> a = new HashSet<>(identityA);
Set<String> b = new HashSet<>(identityB);
System.
out.
println("But now the union of regular sets is messed up:"); System.
out.
println(" " + unionInIdentityHashSet
(a, b
)); }
static <T> Set<T> unionInHashSet(Set<T> a, Set<T> b) {
Set<T> union = new HashSet<>();
union.addAll(a);
union.addAll(b);
return union;
}
static <T> Set<T> unionInIdentityHashSet(Set<T> a, Set<T> b) {
Set<T> union = newIdentityHashSet();
union.addAll(a);
union.addAll(b);
return union;
}
static <T> Set<T> newIdentityHashSet() {
return Collections.
newSetFromMap(new IdentityHashMap
<>()); }
}
aW1wb3J0IGphdmEudXRpbC4qOwoKY2xhc3MgRXhhbXBsZSB7CiAgICBwdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmdbXSBhcmdzKSB7CiAgICAgICAgU2V0PFN0cmluZz4gaWRlbnRpdHlBID0gbmV3SWRlbnRpdHlIYXNoU2V0KCk7CiAgICAgICAgU2V0PFN0cmluZz4gaWRlbnRpdHlCID0gbmV3SWRlbnRpdHlIYXNoU2V0KCk7CiAgICAgICAgCiAgICAgICAgaWRlbnRpdHlBLmFkZCgiWCIpOwogICAgICAgIGlkZW50aXR5Qi5hZGQobmV3IFN0cmluZygiWCIpKTsKICAgICAgICAKICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIlRoaXMgc2hvdWxkIGJlIFtYLCBYXToiKTsKICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIiAgICAiICsgdW5pb25Jbkhhc2hTZXQoaWRlbnRpdHlBLCBpZGVudGl0eUIpKTsKICAgICAgICAKICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIlJldHVybmluZyBhbiBpZGVudGl0eSBoYXNoIHNldCBzb2x2ZXMgdGhpczoiKTsKICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIiAgICAiICsgdW5pb25JbklkZW50aXR5SGFzaFNldChpZGVudGl0eUEsIGlkZW50aXR5QikpOwogICAgICAgIAogICAgICAgIFNldDxTdHJpbmc+IGEgPSBuZXcgSGFzaFNldDw+KGlkZW50aXR5QSk7CiAgICAgICAgU2V0PFN0cmluZz4gYiA9IG5ldyBIYXNoU2V0PD4oaWRlbnRpdHlCKTsKICAgICAgICAKICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIkJ1dCBub3cgdGhlIHVuaW9uIG9mIHJlZ3VsYXIgc2V0cyBpcyBtZXNzZWQgdXA6Iik7CiAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCIgICAgIiArIHVuaW9uSW5JZGVudGl0eUhhc2hTZXQoYSwgYikpOwogICAgfQogICAgCiAgICBzdGF0aWMgPFQ+IFNldDxUPiB1bmlvbkluSGFzaFNldChTZXQ8VD4gYSwgU2V0PFQ+IGIpIHsKICAgICAgICBTZXQ8VD4gdW5pb24gPSBuZXcgSGFzaFNldDw+KCk7CiAgICAgICAgdW5pb24uYWRkQWxsKGEpOwogICAgICAgIHVuaW9uLmFkZEFsbChiKTsKICAgICAgICByZXR1cm4gdW5pb247CiAgICB9CiAgICAKICAgIHN0YXRpYyA8VD4gU2V0PFQ+IHVuaW9uSW5JZGVudGl0eUhhc2hTZXQoU2V0PFQ+IGEsIFNldDxUPiBiKSB7CiAgICAgICAgU2V0PFQ+IHVuaW9uID0gbmV3SWRlbnRpdHlIYXNoU2V0KCk7CiAgICAgICAgdW5pb24uYWRkQWxsKGEpOwogICAgICAgIHVuaW9uLmFkZEFsbChiKTsKICAgICAgICByZXR1cm4gdW5pb247CiAgICB9CiAgICAKICAgIHN0YXRpYyA8VD4gU2V0PFQ+IG5ld0lkZW50aXR5SGFzaFNldCgpIHsKICAgICAgICByZXR1cm4gQ29sbGVjdGlvbnMubmV3U2V0RnJvbU1hcChuZXcgSWRlbnRpdHlIYXNoTWFwPD4oKSk7CiAgICB9Cn0=