Я хочу добавить свои 2 цента при использовании ==
с интернированными строками.
Первое, что делает String.equals
, это this==object
.
Таким образом, хотя и наблюдается небольшой прирост производительности (вы не вызываете метод), с точки зрения сопровождающего использование ==
является кошмаром, поскольку некоторые интернированные строки имеют тенденцию становиться не интернированными.
Поэтому я предлагаю не полагаться на особый случай ==
для интернированных строк, но всегда использовать equals
, как предполагал Гослинг.
РЕДАКТИРОВАТЬ: интернированный становится не интернированным:
V1.0
public class MyClass
{
private String reference_val;
...
private boolean hasReferenceVal ( final String[] strings )
{
for ( String s : strings )
{
if ( s == reference_val )
{
return true;
}
}
return false;
}
private void makeCall ( )
{
final String[] interned_strings = { ... init with interned values ... };
if ( hasReference( interned_strings ) )
{
...
}
}
}
В версии 2.0 сопровождающий решил сделать общедоступным hasReferenceVal
, не вдаваясь в подробности, что он ожидает массив интернированных строк.
V2.0
public class MyClass
{
private String reference_val;
...
public boolean hasReferenceVal ( final String[] strings )
{
for ( String s : strings )
{
if ( s == reference_val )
{
return true;
}
}
return false;
}
private void makeCall ( )
{
final String[] interned_strings = { ... init with interned values ... };
if ( hasReference( interned_strings ) )
{
...
}
}
}
Теперь у вас есть ошибка, которую может быть очень трудно найти, потому что в большинстве случаев массив содержит литеральные значения, а иногда используется не-литеральная строка. Если бы вместо 1023 использовалось equals
, то hasReferenceVal
продолжало бы работать. Еще раз, прирост производительности незначителен, но затраты на обслуживание высоки.