79 votes

Quel est le but de l'expression "new String (...)" en Java?

Tout en regardant en ligne, des exemples de code, j'ai parfois l'affectation d'une Chaîne de caractères constante d'une Chaîne de caractères de l'objet via l'utilisation de l'opérateur new.

Par exemple:

String s;
...
s = new String("Hello World");

Ceci, bien sûr, par rapport à

s = "Hello World";

Je ne suis pas familier avec cette syntaxe et n'ont aucune idée de ce que l'objet ou l'effet serait. Depuis des constantes de Chaîne généralement stockées dans la constante de la piscine et ensuite, quelle que soit la représentation de la JVM a pour traiter les constantes de Chaîne, ce serait quoi que ce soit même être alloué sur le tas?

83voto

Lawrence Dol Points 27976

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.

10voto

Dave Ray Points 20873

La seule fois où j'ai trouvé cela utile, c'est lors de la déclaration de variables de verrouillage:

 private final String lock = new String("Database lock");

....

synchronized(lock)
{
    // do something
}
 

Dans ce cas, les outils de débogage comme Eclipse afficheront la chaîne lorsqu’ils listent ce qui verrouille un fil actuellement en attente ou en attente. Vous devez utiliser "new String", c'est-à-dire allouer un nouvel objet String, car sinon, un littéral de chaîne partagée pourrait éventuellement être verrouillé dans un autre code non lié.

6voto

String s1="foo"; littérale va aller dans StringPool et s1 fera référence.

String s2="foo"; cette fois, il coche la case "foo" littérale est déjà disponible dans StringPool ou pas comme aujourd'hui il existe donc s2 renverra le même littéral.

String s3=new String("toto"); "foo" littérale sera créé dans StringPool d'abord, puis à travers string arg Chaîne du constructeur d'Objet sera créé-je.e "foo" dans le tas en raison de la création d'un objet par le biais de nouvelles opérateur s3 de le soumettre.

Chaîne s4=new String("toto"); le même que s3

si le Système..println(s1==s2); //true en raison littérale de comparaison.

et du Système..println(s3==s4);// false en raison de l'objet de la comparaison(s3 et s4 est créé à différents endroits dans le tas)

4voto

MasterKiller Points 9

L'unique utilitaire de ce constructeur décrit par Software Monkey et Ruggs semble avoir disparu de JDK7. Il n'y a plus de champ offset dans la classe String et la sous-chaîne utilise toujours

 Arrays.copyOfRange(char[] original, int from, int to) 
 

pour couper le tableau de caractères pour la copie.

2voto

Vineet Points 984

Eh bien, cela dépend de ce que les "..." dans l'exemple. Si c'est un StringBuffer, par exemple, ou un tableau d'octets, ou de quelque chose, vous allez obtenir une Chaîne de caractères construite à partir des données que vous soyez simplement de passage.

Mais si c'est juste une autre Chaîne de caractères, comme dans new String("Hello World!"), alors il devrait être remplacé par tout simplement "Hello World!", dans tous les cas. Les chaînes sont immuables, de sorte que le clonage de l'un sert à rien, c'est juste plus détaillé et moins efficace pour créer un objet de type String simplement qu'une copie d'une Chaîne existante (qu'il soit un littéral ou une autre variable de Chaîne que vous avez déjà).

En fait, Efficace Java (que je recommande fortement) utilise exactement ce que l'un de ses exemples "d'Éviter de créer des objets inutiles":


Comme un exemple extrême de ce que ne pas le faire, considérons cette déclaration:

String s = new String("stringette");  **//DON'T DO THIS!**


(À Compter De Java, Deuxième Édition)

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X