guava/src/com/google/common/base/Equivalence.java
public final boolean equivalent(@Nullable T a, @Nullable T b) {
    if (a == b) {
      return true;
    }
    if (a == null || b == null) {
      return false;
    }
    return doEquivalent(a, b);
  }
public final boolean equivalent(@Nullable T a, @Nullable T b) {
    if (a == b) {
      return true;
    }
    if (a == null || b == null) {
      return false;
    }
    return doEquivalent(a, b);
  }
Returns {@code true} if the given objects are considered equivalent.

<p>This method describes an <i>equivalence relation</i> on object references, meaning that for
all references {@code x}, {@code y}, and {@code z} (any of which may be null):

<ul>
<li>{@code equivalent(x, x)} is true (<i>reflexive</i> property)
<li>{@code equivalent(x, y)} and {@code equivalent(y, x)} each return the same result
(<i>symmetric</i> property)
<li>If {@code equivalent(x, y)} and {@code equivalent(y, z)} are both true, then {@code
equivalent(x, z)} is also true (<i>transitive</i> property)
</ul>

<p>Note that all calls to {@code equivalent(x, y)} are expected to return the same result as
long as neither {@code x} nor {@code y} is modified.