40. Returning an identity string
So, what’s an identity string? An identity string is a string built from an object without calling the overridden toString() or hashCode(). It is equivalent to the following concatenation:
object.getClass().getName() + "@"
+ Integer.toHexString(System.identityHashCode(object))
Starting with JDK 19, this string is wrapped in Objects.toIdentityString(Object object). Consider the following class (object):
public class MyPoint {
private final int x;
private final int y;
private final int z;
...
@Override
public String toString() {
return "MyPoint{" + "x=" + x + ", y=" + y
+ ", z=" + z + '}';
}
}
By calling toIdentityString(), we obtain something as follows:
MyPoint p = new MyPoint(1, 2, 3);
// modern.challenge.MyPoint@76ed5528
Objects.toIdentityString(p);
Obviously, the overridden MyPoint.toString() method was not called. If we print out the hash code of p, we get 76ed5528, which is exactly what toIdentityString() returned. Now, let’s override hashCode() as well:
@Override
public int hashCode() {
int hash = 7;
hash = 23 * hash + this.x;
hash = 23 * hash + this.y;
hash = 23 * hash + this.z;
return hash;
}
This time, toIdentityString() returns the same thing, while our hashCode() returns 14ef3.