Java: Почему Строковое равенство может быть доказано с ==?

Это не относится к пустой строке, именно, завершается ли последняя строка (может иметь содержание в нем) с новой строкой.

Большинство текстовых редакторов поместит новую строку в конце последней строки файла, поэтому если последняя строка не будет иметь один, существует риск, что файл был усеченным. Однако существуют допустимые причины, почему Вы не могли бы хотеть новую строку, таким образом, это - только предупреждение, не ошибка.

10
задан Zeemee 9 December 2009 в 07:58
поделиться

2 ответа

Нет. Это по-прежнему плохо - вы по-прежнему будете проверять равенство ссылок вместо равенства значений.

public class Test
{
    public static void main(String[] args)
    {
        String x = "hello";
        String y = new String(x);
        System.out.println(x == y); // Prints false
    }
}

Если вы сейчас видите == тестирование «работает», то это потому, что у вас действительно есть равные ссылки. Наиболее частая причина этого, вероятно, связана с интернированием строковых литералов, но это было в Java всегда:

public class Test
{
    public static void main(String[] args)
    {
        String x = "hello";
        String y = "hel" + "lo"; // Concatenated at compile-time
        System.out.println(x == y); // Prints true
    }
}

Это гарантируется раздел 3.10.5 Спецификации языка Java:

Каждый строковый литерал является ссылкой (§4.3) в экземпляр (§4.3.1, §12.5) класса String (§4.3.3). Строка объекты имеют постоянную ценность. Строка литералы или, в более общем смысле, строки это значения постоянных выражения (§15.28) - "интернированы", поэтому как делиться уникальными экземплярами, используя метод String.intern.

26
ответ дан 3 December 2019 в 15:06
поделиться

Не изменился. Однако компилятор Java использует string.intern (), чтобы гарантировать, что идентичные строки в исходном коде компилируются в один и тот же объект String. Однако, если вы загружаете строку из файла или базы данных, это не будет тот же объект, если только вы не принудительно используете String.intern () или какой-либо другой метод.

Это плохая идея, и вы все равно должны использовать .equals ()

3
ответ дан 3 December 2019 в 15:06
поделиться
Другие вопросы по тегам:

Похожие вопросы: