Je veux ajouter mes deux cents sur l'utilisation ==
avec des chaînes internées.
La première chose String.equals
fait est this==object
.
Ainsi, bien qu'il y ait un gain de performance minuscule (vous n'appelez pas une méthode), du point de vue du mainteneur, l'utilisation de la méthode ==
est un cauchemar, car certaines chaînes internées ont tendance à devenir non internées.
Je suggère donc de ne pas s'appuyer sur le cas particulier du ==
pour les chaînes internées, mais utilisez toujours equals
comme Gosling l'avait prévu.
EDIT : interné devient non-interné :
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 ) )
{
...
}
}
}
Dans la version 2.0, le mainteneur a décidé de faire de l'option hasReferenceVal
public, sans trop préciser qu'il attend un tableau de chaînes internées.
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 ) )
{
...
}
}
}
Vous avez maintenant un bogue, qui peut être très difficile à trouver, car dans la majorité des cas, les tableaux contiennent des valeurs littérales, et parfois une chaîne non littérale est utilisée. Si equals
ont été utilisés à la place de ==
puis hasReferenceVal
aurait continué à fonctionner. Une fois encore, le gain de performance est minuscule, mais le coût de maintenance est élevé.
16 votes
La Javadoc dont vous avez donné le lien indique également que "toutes les chaînes littérales et les expressions constantes à valeur de chaîne sont internées".
2 votes
Dupe de stackoverflow.com/questions/1833581/when-to-use-intern
1 votes
Pas une copie exacte
1 votes
@Jorn : c'est vrai. Alors pourquoi avons-nous
intern
comme méthode publique. Ne devrions-nous pas avoirintern
comme méthode privée, afin que personne ne puisse y avoir accès. Ou bien cette méthode a-t-elle une utilité quelconque ?1 votes
Bozho : En fait, c'est le cas, mais celle-ci est bien mieux définie comme une question.
1 votes
Vous n'avez pas besoin d'utiliser intern() sur "Rakesh" dans l'instruction
String s3 = "Rakesh".intern();
en tant que chaînes littérales sont automatiquement internées.2 votes
@RakeshJuyal : La méthode intern est définie sur un type de chaîne qui peut être des littéraux de chaîne ou des variables. Comment interneriez-vous une variable si la méthode était privée ?