Программирование на JAVA
Меню :
Стартовая
Основы программирования
Программирование на JAVA
Программирование на C++
Программирование на Pascal
Задачи по программированию
public class Test { public Test() {
}
public static void main(String[] args) { Test t = new Test(); String s1 = "Hello world !!!"; String s2 = "Hello world !!!";
System.out.printlnf'String's equally = " + (s1 .equals(s2))); System.out.printlnf'Strings are the same = " + (s1 ==s2));
}
}
В результате на консоль будет выведено:
String's equally = true Strings are the same = true
Теперь несколько модифицируем код:
public class Test { public Test() {
}
public static void main(String[] args) { Testt = newTest(); String s1 = "Hello world !!!"; String s2 = new Stringf'Hello world !!!"); System.out.printlnf'String's equally = " + (s1 .equals(s2))); System.out.printlnf'Strings are the same = " + (s1==s2));
}
В результате на консоль будет выведено:
String's equally = true Strings are the same = false
Почему результат изменился? Дело в том, что создание нового объекта - это одна из самых трудоемких процедур в Java. Поэтому компилятор стремится уменьшить их количество, если это не приводит к непредсказуемому поведению программы.
В примере объявляются две переменных, которые инициализируются одинаковым значением. Поскольку класс String неизменяемый, их значения всегда будут одинаковыми. Это позволяет компилятору завести скрытую вспомогательную текстовую переменную, которая будет хранить такое значение, а все остальные переменные будут ссылаться на него же, а не порождать новые объекты. В результате в первом варианте программы создается лишь один объект String. Для большинства операций это несущественная разница. Исключение составляют действия, которые привязаны к конкретному объекту, а не к его значению. Это метод equals, методы wait/notify.
Во втором варианте указано динамическое обращение к конструктору. В этом случае компилятор уже не имеет возможности заниматься оптимизацией и JVM во время исполнения программы действительно создаст второй объект с точно таким же значением. Что мы и видим по результату выполнения примера.
В Java для строк определен оператор +. При использовании этого оператора производится конкатенация строк. В классе String также определен метод:
public String concat(String s);
Он возвращает новый объект-строку, дополненный справа строкой s. Рассмотрим другой пример.