переменная ссылка на значение строки - PullRequest
0 голосов
/ 01 июня 2010

Как я могу получить ссылочное значение строкового объекта?

Если у меня будет такой класс, как

class T()
{
}
T t = new T();
System.out.println( t); 

распечатайте T @ a3455467, который является справочным значением внутри t

а для строки? может быть с методом hashCode () ??

Ответы [ 5 ]

5 голосов
/ 01 июня 2010

То, что вы хотите, это хэш системной идентификации. Вы можете получить это по:

int id = System.identityHashCode(t);

Реализация по умолчанию Object.toString():

public String toString() {
  return getClass().getName() + "@" + Integer.toHexString(hashCode());
}

Реализация Object.hashCode() по умолчанию равна System.identityHashCode().

Но также хеш-код системной идентификации просто гарантирует постоянство для одного и того же экземпляра (даже не уникального , но ). Это не обязательно должно быть ссылочное значение - каким бы оно ни было в реализации jvm. Реальное эталонное значение непрозрачно , на самом деле не предлагается публике в Java. Вы не можете преобразовать его в шестнадцатеричный адрес и посмотреть в память или что-то в этом роде.

3 голосов
/ 01 июня 2010

Из API:

Object.toString(): метод toString для class Object возвращает строку, состоящую из имени класса, экземпляром которого является объект, символ знака @ шестнадцатеричное представление без знака хеш-кода объекта. Другими словами, этот метод возвращает строку, равную значению:

 getClass().getName() + '@' + Integer.toHexString(hashCode())

Так что да, это просто Integer.toHexString(someString.hashCode()), что вы хотите.


Тем не менее, это не "эталонное значение объекта". Это просто, как говорится, хеш-код объекта в шестнадцатеричном формате. Различные экземпляры String, которые equals, будут иметь одинаковые hashCode(), как указано в контракте. Это также относится и к другим типам.

3 голосов
/ 01 июня 2010

распечатайте T @ a3455467, который является справочным значением внутри t

Нет, это не ссылочное значение t, это просто значение, возвращаемое Object.toString для объекта, на который ссылается t. (Реализация println -метода вызывает метод toString для данного аргумента.)

Если вы говорите,

String s = "hello world";

тогда ссылка на строку сохраняется в s. В Java нет способа (как в C / C ++) получить «адрес» строки (или значение s).

1 голос
/ 01 июня 2010

Если вы имеете в виду Ссылочное значение в смысле Адрес памяти объекта, это не имеет смысла в Java. Адрес памяти объекта может измениться в любое время в эпоху копирования сборщиков мусора. Кроме того, размер адреса зависит от платформы / реализации хоста JVM (32/64 бит, возможно, даже больше в будущем).

0 голосов
/ 01 июня 2010

Перегруженный String.valueOf( t ) - это еще один способ сделать это.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...