Оператор == в 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"
поэтому, когда он встречает другую строку констант, он проверяет и обнаруживает, что эта строка уже загружена в память. Таким образом, он просто снова использует тот же объект.
В результате они являются одним и тем же точным объектом в памяти.