Java объектно-ориентированный и кроме примитивных типов все в Java - это классы.Tinky-Winky писал(а):Ответ на вопрос пользователя "compl"
День добрый и вам
Постараюсь ответить на ваш вопрос в свете личного понимания.
Поскольку при разработке мы используем синтаксис языка java(для файлов nameApp.java),то и базовые понятия должны соответствовать этому синтаксису.
Не много теории.
equals это - операция сравнения содержимого соответствующих переменным областям памяти
== это - операция сравнения ссылок.
В чём разница?
метод equals(Object) класса java.lang.Object
сравнивает содержимое двух областей памяти
== операция сравнения двух ссылок на объекты. Т.е. эта операция вернет true тогда и только тогда, когда содержимое совпадает, что означает, что переменные указывают на ОДИН И ТОТ ЖЕ объект.
Что касается вашего случая то здесь есть маленький нюанс.
Одинаковые строки на самом деле являются единственным объектом. В чем легко убедиться, выполнив следующий код:
[syntax=java]
String str1 = "string";
String str2 = "string";
System.out.println(str1==str2 ? "the same" : "not the same");
[/syntax]
Результатом будет "the same". Что означает, что ссылки на строки равны. Это сделано на уровне компилятора, очевидно, для экономии памяти. Компилятор создает ОДИН экземпляр строки, и присваивает str1 и str2 ссылку на этот экземпляр.
Однако, это относится только к строкам, объявленным как литералы, в коде. Если скомпоновать строку из кусков, ссылка на нее будет другой. Подтверждение – данный пример:
[syntax=java]
String str1 = "string";
String str2 = "str";
String str3 = "ing";
System.out.println(str1==(str2+str3) ? "the same" : "not the same");
[/syntax]
Результатом будет "not the same". Также можно создать новый объект с помощью копирующего конструктора:
[syntax=java] String str1 = "string";
String str2 = new String("string");
System.out.println(str1==str2 ? "the same" : "not the same");
[/syntax]
Результатом также будет "not the same".
Таким образом, иногда строки можно сравнивать и через сравнение ссылок. Но на это лучше не полагаться.
При объяснении использованы материалы из сайта(http://www.skipy.ru)
Надеюсь смог помочь
Возможно в компилятор встроена определенная оптимизация, но с точки зрения теории
Str1 = "строка1";
Str2 = "строка1";
это тоже само что
Str1 = new String("строка1");
Str2 = new String("строка2");
т.е. 2 разных объекта и указатели на них будут разные.
Если предположить, что Str1 == Str2, т.е. указатель для них указывает на одну область памяти, тогда при изменении в Str1 значения автоматически поменяется и в Str2.
но в спецификации к языку есть такое понятие, как пул строк. и в определенных случаях указатели двух переменных будут указывать на одну область памяти.
как этот пул строиться, не могу сказать, внимательно не читал, но надеяться на такое сравнение я бы не стал.
Для класса String переопределен метод equals, при вызове которого этот метод выполняет посимвольное сравнение и возвращает true или false, т.е. не выполняет сравнение указателей,а сравнивает именно строку.