В некоторых случаях вам действительно важно, имеете ли дело с одним и тем же объектом, а не равны ли два объекта. В таких случаях вам нужно ==
вместо equals()
. Компилятор не может узнать, действительно ли вы хотите сравнить ссылки на равенство или объекты, на которые они указывают.
Теперь гораздо менее вероятно, что вы захотите ==
для строк, чем для пользовательского типа, но это не гарантирует, что вы этого не захотите, и даже если это Сделано, это означает, что компилятор должен был бы проверить строки специального случая, чтобы убедиться, что вы не используете ==
для них.
Кроме того, поскольку строки являются неизменяемыми, JVM может создавать строки, которые будут равны для equals()
общего ресурса для одного и того же экземпляра (для экономии памяти), и в этом случае они также будут равны для ==
. Таким образом, в зависимости от того, что делает JVM, ==
вполне может вернуть true. И пример, который вы привели, на самом деле дает хороший шанс, потому что они оба строковые литералы, поэтому для JVM было бы довольно легко сделать их одной и той же строкой, и, вероятно, это произойдет. И, конечно, если вы хотите увидеть, создает ли JVM две строки для одного и того же экземпляра, вы бы имели , чтобы использовать ==
вместо equals()
, поэтому есть законная причина хотеть используйте ==
прямо на строках.
Итак, компилятор не может знать достаточно того, что вы делаете, чтобы знать, что использование ==
вместо equals()
должно быть ошибкой. Это может привести к ошибкам, если вы не будете осторожны (особенно если вы привыкли к языку, подобному C ++, который перегружает ==
вместо отдельной функции equals()
), но компилятор может сделать для вас только очень многое. Есть законные причины для использования ==
вместо equals()
, поэтому компилятор не будет отмечать это как ошибку.