я увидел вопрос о тесте программирования 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 ** для * адрес памяти *. Только '==' проверяет ссылочное равенство. И ** 2 ** является действительным критерием для * значения * равенства. –
Возможный дубликат [Есть ли способ получить ссылочный адрес?] (Http://stackoverflow.com/questions/8820164/is-there-a-way-to-get-a-reference-address) –
Или если вам нужен менее «небезопасный» ответ: http://stackoverflow.com/questions/1961146/memory-address-of-variables-in-java –