2016-03-16 2 views
0

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

Если str1 и str2 обе строки, , какие из следующих выражений будет правильно определять , являются ли они равны?

(1) (str1 == str2)

(2) str1.equals (str2)

(3) (str1.compareTo (str2) == 0)

А) 1, 2 и 3 будет все работы

В) 2 и 3

С) 1 и 2

D) 1 и 3

Я думал, что ответ был B. Учебник подтвердил это. Это подтвердил и ответ на вопрос учителя.

Я пробовал проверить все варианты. Все трое работали. Я думаю, что вопрос имел в виду: «Если str1 и str2 являются объектами String». Когда я создал строковые объекты, он подтвердил, что B является правильным. Ниже приведен код ...

То, что я хотел бы сделать, это распечатать адреса памяти строк, чтобы в черно-белом убедиться, что они сравнивают адреса памяти, а не строки. Я видел, как кто-то делал это один раз случайно, и мы поняли, что произошло. Это было сделано с очень простым кодом, но мы не можем вспомнить случайный синтаксис. Я знаю, адрес должен содержать символ @. Я исследовал это в течение нескольких часов, и я не думаю, что хэш-коды являются адресами, потому что они одинаковы для обеих строк, и они должны быть разными. Может ли кто-нибудь добавить в мой код, что необходимо для печати обоих адресов?

public class Q1 
{ 
public static void main(String[] args) 
{ 
    String str1 = new String("dog"); 
    String str2 = new String("dog"); 

    System.out.println(str1 + " & " + str2); 
    System.out.println("Hash Codes"); 
    System.out.println(str1 + Integer.toHexString(str1.hashCode())); 
    System.out.println(str2 + Integer.toHexString(str2.hashCode())); 
    System.out.println(); 

    if (str1 == str2) 
    { 
     System.out.println(str1 == str2); 
     System.out.println("1 Equal"); 
     System.out.println(); 
    } 
    else 
    { 
     System.out.println(str1 == str2); 
     System.out.println("1 Not Equal"); 
     System.out.println(); 
    } 

    if (str1.equals(str2)) 
    { 
     System.out.println(str1.equals(str2)); 
     System.out.println("2 Equal"); 
     System.out.println(); 
    } 
    else 
    { 
     System.out.println(str1.equals(str2)); 
     System.out.println("2 Not Equal"); 
     System.out.println(); 
    } 

    if (str1.compareTo(str2) == 0) 
    { 
     System.out.println(str1.compareTo(str2) == 0); 
     System.out.println("3 Equal"); 
     System.out.println(); 
    } 
    else 
    { 
     System.out.println(str1.compareTo(str2) == 0); 
     System.out.println("3 Not Equal"); 
     System.out.println(); 
    } 
} 
} 
+1

Ответ: ** 1 ** для * адрес памяти *. Только '==' проверяет ссылочное равенство. И ** 2 ** является действительным критерием для * значения * равенства. –

+0

Возможный дубликат [Есть ли способ получить ссылочный адрес?] (Http://stackoverflow.com/questions/8820164/is-there-a-way-to-get-a-reference-address) –

+0

Или если вам нужен менее «небезопасный» ответ: http://stackoverflow.com/questions/1961146/memory-address-of-variables-in-java –

ответ

0

Простой ответ: Нет, вы не можете.

Object.hashCode()может вернуть внутренний адрес объекта, но он зависит от реализации. Вы можете проверить его на Javadocs.

Насколько полезен метод hashCode, определенный классом Object, возвращает различные целые числа для отдельных объектов. (Это обычно реализуется путем преобразования внутреннего адреса объекта в целое число, но этот метод реализации не требуется языком программирования JavaTM.)

Например, по умолчанию HotSpot возвращает случайное число из Object.hashCode() см Source code.

+0

Вопросы заключались не в том, возвращает ли объект Object.hashCode() 'адрес памяти , но есть ли какой-либо метод для получения адреса памяти.И есть способы, см. Дубликат, который я предложил для этого вопроса (в комментариях ниже) –

+0

Я только что видел эту ссылку, не знал, что есть небезопасный API, и это лучше ответить на этот вопрос. Я упомянул 'hashCode', потому что он говорит, что может возвращать внутренний адрес в javadocs, однако он не является надежным. – Nier