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
.