Это может показаться глупым, но почему компилятор Java не предупреждает об этом выражении в следующем выражении if:
String a = "something";
if(a == "something"){
System.out.println("a is equal to something");
}else{
System.out.println("a is not equal to something");
}
Я понимаю, почему выражение неверно, но AFAIK, a никогда не может быть равно строковой литературе "что-то". Компилятор должен понять это и, по крайней мере, предупредить меня, что я идиот, который кодирует путь до поздней ночи.
Разъяснение
Этот вопрос заключается не в сравнении двух переменных объекта String, а в сравнении строковой переменной String с литералом String. Я понимаю, что следующий код полезен и приведет к различным результатам, чем .equals()
:
String a = iReturnAString();
String b = iReturnADifferentString();
if(a == b){
System.out.println("a is equal to b");
}else{
System.out.println("a is not equal to b");
}
В этом случае a и b могут фактически указывать на одну и ту же область в памяти, даже если это не из-за интернирования. В первом примере, однако, единственная причина, по которой это было бы правдой, - это то, что Java делает что-то за кулисами, которое мне не полезно, и которое я не могу использовать в своих интересах.
Следующий вопрос Даже если a и строковый литерал указывают на одну и ту же область в памяти, как это полезно для меня в выражении типа выше. Если это выражение возвращает true, нет ничего полезного, что я мог бы сделать с этим знанием, не так ли? Если бы я сравнивал две переменные, то да, эта информация была бы полезна, но с переменной и литералом это было бы бессмысленно.