Почему объект Object.toString() по умолчанию возвращает шестнадцатеричное представление хэш-кода?

Мне интересно, почему Object.toString() возвращает это:

return getClass().getName() + "@" + Integer.toHexString(hashCode());

в отличие от этого:

return getClass().getName() + "@" + hashCode();

Какие преимущества дает вам отображение хеш-кода как шестнадцатеричного, а не десятичного?

Ответы

Ответ 1

Object.hashCode используется для вычисления на основе местоположения памяти, где находится объект. Места памяти почти повсеместно отображаются как шестнадцатеричные.

Возвращаемое по умолчанию значение toString не так сильно интересуется хеш-кодом, а скорее способ уникальной идентификации объекта для целей отладки, а хеш-код служит для идентификации (на самом деле, комбинация имени класса + адрес памяти поистине уникальна, и, хотя хеш-код не является уникальным, он часто близок).

Ответ 2

Мне не нравится принятый ответ. Вот мой ответ.

Короткий ответ: потому что hex легче запоминать, поскольку число, выраженное в шестнадцатеричном выражении, короче и имеет больший характер, чем тот же номер, выраженный в десятичной форме.

Более длинный ответ: вы не собираетесь использовать хеш-код для выполнения арифметики с ним в голове, поэтому вам не нужно, чтобы он был десятичным. С другой стороны, вы, скорее всего, собираетесь использовать его единственным способом, которым он предназначен для использования, то есть указать, относятся ли два хеш-кода к одному и тому же объекту или к различным объектам. Другими словами, вы будете использовать его как уникальный идентификатор или мнемонику для объекта. Таким образом, факт, что это число, не имеет значения; вы могли бы также подумать об этом как о хэш-строке. Ну, так получилось, что нашим мозгам намного легче сохранить (для целей сравнения) короткие строки, состоящие из 16 разных символов, чем более длинные строки, состоящие всего из 10 разных символов.