Существует другой вариант использования: объекты , в которых (некоторые) поля должны сравниваться без учета их порядка . Например, если вы хотите, чтобы пара (a, b)
всегда была равна паре (b, a)
.
XOR имеет свойство a ^ b
= b ^ a
, поэтому в таких случаях его можно использовать в хэш-функции.
Примеры: (полный код здесь )
Определение:
final class Connection {
public final int A;
public final int B;
// some code omitted
@Override
public boolean equals(Object o) {
if (this == o) return true;
if (o == null || getClass() != o.getClass()) return false;
Connection that = (Connection) o;
return (A == that.A && B == that.B || A == that.B && B == that.A);
}
@Override
public int hashCode() {
return A ^ B;
}
// some code omitted
}
использование:
HashSet<Connection> s = new HashSet<>();
s.add(new Connection(1, 3));
s.add(new Connection(2, 3));
s.add(new Connection(3, 2));
s.add(new Connection(1, 3));
s.add(new Connection(2, 1));
s.remove(new Connection(1, 2));
for (Connection x : s) {
System.out.println(x);
}
// output:
// Connection{A=2, B=3}
// Connection{A=1, B=3}