Le seul endroit où vous pouvez avoir besoin d' new String(String)
est de forcer une sous-chaîne à copier à un nouveau sous-jacente tableau de caractères, comme dans
small=new String(huge.substring(10,20))
Toutefois, ce comportement est malheureusement sans-papiers et dépendant de l'implémentation.
J'ai été brûlé par ce lors de la lecture de gros fichiers (jusqu'à 20 MiB) dans une Chaîne et la sculpture dans les lignes après le fait. J'ai fini avec toutes les chaînes pour les lignes de référencement sur le char [], composé de la totalité du fichier. Malheureusement, involontairement, a gardé une référence à l'ensemble de la matrice pour les quelques lignes que j'ai occupé pendant un temps plus long que le traitement du fichier - j'ai été obligé d'utiliser l' new String()
pour le contourner.
La seule mise en œuvre agnostique façon de le faire est:
small=new String(huge.substring(10,20).toCharArray());
Ce qui malheureusement doit copier le tableau à deux reprises, une fois pour l' toCharArray()
et une fois dans la Chaîne de constructeur.
Il doit être documenté de façon à obtenir une nouvelle Chaîne en copiant les caractères d'une œuvre existante; ou à la documentation de l' String(String)
doit être amélioré pour le rendre plus explicite (il y a une implication là, mais c'est plutôt vague et sujette à interprétation).
Piège de Supposer que le Doc N'a pas d'État
En réponse aux commentaires, qui continuent d'arriver, observer ce que les Apache de l'Harmonie de la mise en œuvre de l' new String()
était:
public String(String string) {
value = string.value;
offset = string.offset;
count = string.count;
}
C'est vrai, pas de copie de la sous-matrice. Et pourtant, il est toujours conforme à l' (Java 7) de la Chaîne de la documentation, en ce qu'il:
Initialise une Chaîne nouvellement créée objet de sorte qu'il représente la même séquence de caractères comme argument; en d'autres termes, la chaîne nouvellement créée est une copie de l'argument chaîne. À moins explicite d'une copie de l'original est nécessaire, l'utilisation de ce constructeur est inutile étant donné que les Chaînes sont immuables.
Les principales morceau "copie de l'argument chaîne de caractères"; il ne dit pas "copie de la chaîne d'argument, et le tableau de caractères de soutien à la chaîne".
Faire attention à ce que vous programmez à la documentation et non pas une mise en œuvre.