Так как оператор «==» сравнивает на идентичность только примитивы и ссылки на объект, в java для сравнения строк используется метод equals(), наследуемый от класса Object и реализованный в классе java.lang.String. Метод сравнивает строку, на которой он вызван, со строкой, которую в него передали и возвращает true или false.
... String str1 = new String("myString"); String str2 = new String("MyString"); System.out.println(str1.equals(str2)); str2 = new String("myString"); System.out.println(str1.equals(str2)); ...
Выводом вышеуказанного кода будет сначала false, затем true.
Любопытно, что если создавать строки не через new, а просто присвоить им одинаковые значения, то они будут ссылаться на один объект
String str1 = "myString";
String str2 = "myString"; System.out.println(str1==str2);
результат будет true. Не знаю зачем так, но все таки) Мб кто объяснит… Банальная экономия памяти может?
Всё верно. Ведь в Java строки, в зависимости от способа их создания, могут помещаться в пул или просто сваливаться в кучу. При создании используя кавычки, строки помещаются в пул и перед созданием проверяется, не было ли ранее такой строки уже в нём? Если она там есть, то просто возвращается ссылка на неё. От сюда мы получаем ссылки на один и тот же объект. И да, это экономия памяти. Стоит помнить, что строки в Java финализированы, а это значит что ссылка на один объект строки из разных мест нам ничем не грозит.
String s1 = "hello";
String s2 = "hello";
System.out.println(s1==s2);
s1+=", friend!";
System.out.println(s1==s2);
System.out.println("s1: " + s1);
System.out.println("s2: " + s2);
Вывод:
true
false
s1: hello, friend!
s2: hello
То есть при любом изменении создается новая строка, как я понял, а старая висит в памяти пока ее мусорщик не почистит? Хреновато, когда у тебя цикл на over9000 итераций, в котором строками манипулируют