Tag Archives: String

Сравнение строк в Java

Недавно проходил собеседование по 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()