Недавно проходил собеседование по Java. В тестах был вопрос.
Что возвращает следующий код?
public class Main
{
public static void main(String[] args)
{
String s1 = "abc";
String s2 = "abc";
String str1 = new String("abc");
String str2 = new String("abc");
if (s1 == s2){
System.out.println("s1 == s2");
}
else {
System.out.println("s1 != s2");
}
if(s1 + s2 == s2 + s1){
System.out.println("s1 + s2 == s2 + s1");
}
else {
System.out.println("s1 + s2 != s2 + s1");
}
if (str1 == str2) {
System.out.println("str1 == str2");
}
else {
System.out.println("str1 != str2");
}
if (s1 == str1){
System.out.println("str1 == s1");
}
else {
System.out.println("str1 != s1");
}
}
}
Внимание, правильный ответ:
s1 == s2
s1 + s2 != s2 + s1
str1 != str2
str1 != s1
Для меня было неожиданно, что
s1 == s2. Это связано с тем, что в java есть так называемый
string intern pool (см.
String interning), в который заносится адрес обьекта строковой константы, при ее первом обьявлении. А если дальше еще встречается эта константа, то используется адрес объекта String из пула, а не создается новый. Но если строка была создана, вот так:
String str1 = new String("abc");
то она автоматически в пул не помещается. Для того, что бы это произошло, нужно вызвать метод
intern()