Je suis tombé sur cette ligne de code hérité, que j'essaie de comprendre:
String newString = new String(oldString.getBytes("UTF-8"), "UTF-8"));
Autant que je puisse comprendre, il s'agit d'encoder et de décoder en utilisant le même charSet.
En quoi est-ce différent des suivants?
String newString = oldString;
Existe-t-il un scénario dans lequel les deux lignes auront des sorties différentes?
p.s .: Juste pour clarifier, oui je connais le excellent article sur l'encodage par Joel Spolsky !
Cela pourrait être une façon compliquée de faire
String newString = new String(oldString);
Cela raccourcit la chaîne car le caractère sous-jacent [] utilisé est beaucoup plus long.
Cependant, plus spécifiquement, il vérifiera que chaque caractère peut être encodé en UTF-8.
Il y a des "caractères" que vous pouvez avoir dans une chaîne qui ne peuvent pas être encodés et ceux-ci seraient transformés en ?
Aucun caractère compris entre\uD800 et\uDFFF ne peut être encodé et sera transformé en '?'
String oldString = "\uD800";
String newString = new String(oldString.getBytes("UTF-8"), "UTF-8");
System.out.println(newString.equals(oldString));
impressions
false
En quoi est-ce différent des suivants?
Cette ligne de code ici:
String newString = new String(oldString.getBytes("UTF-8"), "UTF-8"));
construit un nouvel objet String (c'est-à-dire une copie de oldString
), tandis que cette ligne de code:
String newString = oldString;
déclare une nouvelle variable de type Java.lang.String
et l'initialise pour faire référence au même objet String que la variable oldString
.
Y a-t-il un scénario dans lequel les deux lignes auront des sorties différentes?
Absolument:
String newString = oldString;
boolean isSameInstance = newString == oldString; // isSameInstance == true
vs.
String newString = new String(oldString.getBytes("UTF-8"), "UTF-8"));
// isSameInstance == false (in most cases)
boolean isSameInstance = newString == oldString;
a_horse_with_no_name (voir commentaire) a raison bien sûr. L'équivalent de
String newString = new String(oldString.getBytes("UTF-8"), "UTF-8"));
est
String newString = new String(oldString);
moins la différence subtile par rapport à l'encodage que Peter Lawrey explique dans sa réponse.