Оператор == в Java

Следующее верно в Java

"abc"=="abc"

Зачем? Две строки - это два разных объекта, они не должны иметь одинаковую идентичность объекта?

3 ответа

Решение

Java хранит все литералы (строки, помещенные в код) в специальной части памяти JVM. Если есть два или более одинаковых литералов, JVM просто указывает на один и тот же объект, а не создает несколько строк с одинаковым содержимым.

Так:

"ab" == "ab" // true - because they are the same objects

но:

"ab" == new String("ab") // false - because new String(...) is new String not literal

Вы можете получить или переместить вашу строку в специальную память, вызвав intern() метод.

    String ab1 = "ab";
    String ab2 = new String("ab");
    // ab1 == ab2 is false as described above
    ab2 = ab2.intern();
    // ab1 == ab2 but now it's true because ab2 pointers to "ab" in special part of memory.

== Операция над непримитивным объектом в java будет сравниваться по месту в памяти. Поскольку обе эти строки являются константами времени компиляции, компилятор сохранит их только один раз, и поэтому вы получите результат, который вы описываете.

Это из-за оптимизации, которую выполняет компилятор Java.

При компиляции он видит, что у вас есть постоянная строка "abc"поэтому, когда он встречает другую строку констант, он проверяет и обнаруживает, что эта строка уже загружена в память. Таким образом, он просто снова использует тот же объект.

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

Другие вопросы по тегам