Проверка на наличие одинаковых экземпляров 2 разных (включенный пример) - PullRequest
8 голосов
/ 07 сентября 2010

Я использую == в приведенном ниже коде и выводю «Равно!», Почему?Может кто-нибудь объяснить, почему эти две разные строки a и b равны?

public class test
{
    public static void main()
    {
        String a = "boy";
        String b = "boy";

        if(a == b)
        {
            System.out.println("Equals!");
        }
        else
        {
            System.out.println("Does not equal!");
        }
    }
}

Ответы [ 6 ]

10 голосов
/ 07 сентября 2010

Это связано с String интернированием .

Java (JVM) хранит коллекцию String литералов, которые используются для экономии памяти.Итак, всякий раз, когда вы создаете String, например, так:

String s = "String";

Java 'интернирует' строку.Однако, если вы создадите String следующим образом:

String s = new String("String");

Java не будет автоматически интернировать String.Если бы вы создавали свои строки таким образом, ваш код давал бы другие результаты.

Быстрый поиск в Google обнаружил множество хороших ресурсов, касающихся String интернирования.

2 голосов
/ 07 сентября 2010

String a = "boy"; создаст новый строковый объект со значением ("boy"), поместит его в пул строк и заставит a обращаться к нему.

Когда интерпретатор видит String b = "boy";, он сначала проверяет, присутствует ли string "boy" в пуле строк, поскольку он присутствует, новый объект не создается и b создается для ссылки на тот же объект, на который ссылается a.

Поскольку обе ссылки содержат одинаковое содержание, они проходят тест на равенство.

2 голосов
/ 07 сентября 2010

Эта статья объяснит это в деталях:

В чем разница между == и equals () в Java?

После выполнения String a = «Мальчик»; JVM добавляет строка «мальчик» в строку пул и на следующей строке кода, это снова встречает String b = ”boy”; в этом случае JVM уже знает, что эта строка уже там в бассейне, поэтому он не создает новая строка Таким образом, обе строки a и b указывают на одну и ту же строку, что означает, что они указать на ту же ссылку.

1 голос
/ 07 сентября 2010

Поскольку у среды выполнения будет пул строк, и когда вам потребуется назначить новую константную строку, во время выполнения загляните внутрь пула, если пул содержит его, тогда они устанавливают переменную точку на тот же объект String внутриpool.

Но вы никогда не должны зависеть от этого, чтобы проверить, равны ли строки содержимого.Вы должны использовать метод: equals

0 голосов
/ 07 сентября 2010

Всякий раз, когда мы создаем строку, как показано ниже:

String str1 = "abc";
String str2 = "abc";

JVM проверит str2 = "abc" в пуле строковых констант, если он присутствует, он не будет создавать новую строку, вместо этого он будет указывать на строкуодин в пуле строковых констант.

Но в случае этого String str = new String("abc"); он всегда будет создавать новый объект String, но мы можем использовать функцию intern(), чтобы заставить JVM просматривать пул строковых констант.

0 голосов
/ 07 сентября 2010

Как правильно объяснено выше, в случае сравнения '==' среда выполнения будет искать в пуле String наличие строки.Однако очень возможно, что во время сборки мусора или во время проблем с памятью виртуальная машина может уничтожить пул строк.Поэтому оператор "==" может возвращать или не возвращать правильное значение.

Урок. Всегда используйте equals() для сравнения.

...