Сравнение строк в 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()

2 thoughts on “Сравнение строк в Java

  1. admin Post author

    В продолжение темы

    if(“ab” == “a” + “b”){
    System.out.println(“ab == a + b”);
    }
    else {
    System.out.println(“ab != a + b”);
    }

    String s1 = “a”;
    String s2 = “b”;
    String s3 = “ab”;

    if(s3 == s1 + s2){
    System.out.println(“s3 == s1 + s2″);
    }
    else {
    System.out.println(“s3 != s1 + s2″);
    }

    String test1 = new String(“dddd”);
    String test2 = test1.intern();

    if(test1 == test2){
    System.out.println(“test1 == test2″);
    }
    else {
    System.out.println(“test1 != test2″);
    }

    String test3 = “dddd”;
    if(test3 == test2){
    System.out.println(“test3 == test2″);
    }
    else {
    System.out.println(“test3 == test2″);
    }

    вернет
    ab == a + b
    s3 != s1 + s2
    test1 != test2
    test3 == test2

    Reply

Leave a Reply

Your email address will not be published. Required fields are marked *

You may use these HTML tags and attributes: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>