On dirait que vous voulez faire un littéral multiligne, ce qui n'existe pas en Java.
Votre meilleure alternative est d'utiliser des cordes qui sont juste +
ensemble. Les autres options mentionnées (StringBuilder, String.format, String.join) ne sont préférables que si vous commencez avec un tableau de chaînes.
Considérez ceci :
String s = "It was the best of times, it was the worst of times,\n"
+ "it was the age of wisdom, it was the age of foolishness,\n"
+ "it was the epoch of belief, it was the epoch of incredulity,\n"
+ "it was the season of Light, it was the season of Darkness,\n"
+ "it was the spring of hope, it was the winter of despair,\n"
+ "we had everything before us, we had nothing before us";
Versus StringBuilder
:
String s = new StringBuilder()
.append("It was the best of times, it was the worst of times,\n")
.append("it was the age of wisdom, it was the age of foolishness,\n")
.append("it was the epoch of belief, it was the epoch of incredulity,\n")
.append("it was the season of Light, it was the season of Darkness,\n")
.append("it was the spring of hope, it was the winter of despair,\n")
.append("we had everything before us, we had nothing before us")
.toString();
Versus String.format()
:
String s = String.format("%s\n%s\n%s\n%s\n%s\n%s"
, "It was the best of times, it was the worst of times,"
, "it was the age of wisdom, it was the age of foolishness,"
, "it was the epoch of belief, it was the epoch of incredulity,"
, "it was the season of Light, it was the season of Darkness,"
, "it was the spring of hope, it was the winter of despair,"
, "we had everything before us, we had nothing before us"
);
Versus Java8 String.join()
:
String s = String.join("\n"
, "It was the best of times, it was the worst of times,"
, "it was the age of wisdom, it was the age of foolishness,"
, "it was the epoch of belief, it was the epoch of incredulity,"
, "it was the season of Light, it was the season of Darkness,"
, "it was the spring of hope, it was the winter of despair,"
, "we had everything before us, we had nothing before us"
);
Si vous voulez que la nouvelle ligne soit adaptée à votre système particulier, vous devez soit utiliser System.lineSeparator()
ou vous pouvez utiliser %n
sur String.format
.
Une autre option est de placer la ressource dans un fichier texte, et de lire simplement le contenu de ce fichier. Cette solution est préférable pour les chaînes de caractères très volumineuses afin d'éviter d'alourdir inutilement vos fichiers de classe.
13 votes
StringBuilder.append() est préférable à plus lorsqu'il s'agit d'ajouter de manière répétée à une chaîne de caractères, car chaque fois que vous faites
string1 + string2
vous allouez un nouvel objet chaîne et copiez les caractères des deux chaînes d'entrée. Si vous ajoutez n chaînes ensemble, vous ferez n-1 allocations et approximativement (n^2)/2 copies de caractères. StringBuilder, d'autre part, copie et réalloue moins fréquemment (bien qu'il fasse toujours les deux lorsque vous dépassez la taille de son tampon interne). Théoriquement, il y a des cas où le compilateur pourrait convertir + pour utiliser StringBuilder mais en pratique qui sait.1 votes
Oups. La partie concernant les copies de caractères était un peu confuse/peu claire. Chaque caractère est copié une fois pour chaque chaîne qui le suit dans la concaténation. Si toutes vos chaînes de caractères sont d'un seul caractère, vous obtenez approximativement (n^2)/2 copies de caractères. Il s'agit en fait de (n^2)/2 copies de chaînes, sauf que les dernières fois qu'une chaîne est copiée, elle l'est en même temps que les éléments auxquels elle a été jointe (mais le coût est proportionnel au nombre de caractères, donc compter les copies de chaînes est un peu trompeur). Pour faire court : le coût est approximativement quadratique, alors que StringBuilder essaie de rendre le coût amorti linéaire.
0 votes
Il y a un article sur ce sujet - j'ai ajouté un lien ci-dessous, mais le voici à nouveau : java.sun.com/developer/JDCTechTips/2002/tt0305.html
5 votes
Chaque fois que je saute dans le débogueur, + est converti en un appel StringBuilder.append(), sur Java 1.5. J'ai eu des collègues qui m'ont dit confusément que StringBuilder avait un bogue parce qu'ils déboguent dans un code qui ne semble pas l'appeler et se retrouvent là.
4 votes
Voir aussi : stackoverflow.com/questions/782810/
65 votes
Notez qu'une chaîne littérale composée de "abc". \n " + "def \n "etc. n'utilise pas StringBuilder : le compilateur les colle ensemble et les place dans le fichier .class comme un seul littéral, comme pour les autres types de pliage de constantes.
7 votes
La plupart des IDE permettent de saisir des chaînes de caractères de plusieurs lignes, c'est-à-dire qu'il suffit de taper ou de coller ce que l'on veut dans une chaîne de caractères "" pour que le système ajoute le symbole \n et " + " si nécessaire. Par exemple, je peux coller 40 lignes de texte dans une chaîne et l'IDE s'en occupe pour vous.
0 votes
@Laurence Gonsalves : C'est ce que j'ai appris à l'école, mais j'ai récemment vérifié le bytecode qui a été compilé à partir de ma concaténation de plusieurs chaînes de caractères, et il utilisait
StringBuilder
. C'était avec le compilateur d'Eclipse, je ne sais pas ce qu'il en est pour les autres compilateurs.javac
.0 votes
@Bart van Heukelom : c'est pourquoi j'ai dit "mais en pratique qui sait". Jamais le compilateur Java (y compris les versions récentes si
javac
Je crois que j'essaye d'optimiser les choses ici et que je vais me servir de ce que j'ai appris.StringBuilder
dans la mise en œuvre de+
dans certains cas. La dernière fois que j'ai vérifié, ces cas étaient assez simples, cependant, il est assez facile d'avoir du code qui utilise+
et compile quelque chose d'efficace qui devient soudainement quadratique à cause d'un changement apparemment mineur dans la source. A moins que tous vos+
sont dans une seule expression, j'utiliseraisStringBuilder
à la place.2 votes
Pour répéter araqnid, qui semble avoir été enterré, étant donné le nombre de réponses qui recommandent StringBuilder : les littéraux adjacents sont concaténés par le compilateur. Notez que c'est seulement si vous utilisez +. Pour +=, vous obtenez un StringBuilder. Je dirais même qu'utiliser StringBuilder en dehors d'une boucle est un peu un TOC.
0 votes
Cette réponse montre comment coller des chaînes de caractères échappées sur plusieurs lignes dans Eclispe.
1 votes
Je crois que ce que @Laurence a dit est faux : même si l'on ne considère pas que le compilateur joint les littéraux en un seul, "a" + "b" + "c" + "d" ne génère PAS 3 chaînes supplémentaires. C'est un comportement défini que le code ci-dessus est généré pour
new StringBuilder().append("a").append("b").append("c").append("d").toString()
(ou StringBuffer avec JDK < 1.5). Par conséquent, dans ce cas, n'utilisez jamais StringBuffer/StringBuilder car cela ne sert à rien.1 votes
@AdrianShum pouvez-vous indiquer la spécification qui définit le comportement que vous décrivez ? Notez également que j'ai dit "A moins que tous vos problèmes de sécurité soient résolus".
+
sont dans une seule expression...", et dans votre exemple, ils sont tous dans une seule expression.0 votes
@LaurenceGonsalves Après une brève recherche, j'ai trouvé que JLS ne semble pas avoir mis ce que j'ai dit comme spécification, mais le comportement est celui que le JDK a implémenté (je doute qu'un autre JDK ait une grande différence sur ce point). J'ai également noté votre ligne " dans une seule expression", mais vos premiers commentaires donnaient l'impression que la même chose s'applique à une expression avec plusieurs concats et votre déclaration " dans une seule expression" n'a pas encore été clarifiée, c'est pourquoi j'ai indiqué le comportement juste pour éviter toute confusion ou tout malentendu sur le comportement du JDK.
1 votes
J'ai décidé d'utiliser stackoverflow.com/questions/12115115/ . Superbe et élégant.
0 votes
Fabuleux, c'est JUSTE ce que je veux faire quand j'ai affaire à des requêtes sql de 500 colonnes au milieu du code java que je dois déchiffrer. (Je préfère de loin la solution de PHP). Est-ce que je peux simplement changer mon fichier de *.java en *.groovy ?
0 votes
Duplicata possible de Coller une chaîne Java de plusieurs lignes dans Eclipse
3 votes
C'est le mauvais côté de Java/Oracle, comparé à C#/MS, perl, etc.....
0 votes
L'intérêt des chaînes de caractères multilignes est qu'elles peuvent être utiles ailleurs, en plus du code source, mais pas si elles sont enveloppées dans un tas de syntaxe java inutile - l'exemple classique est une requête SQL que l'on peut vouloir coller dans une fenêtre de client db sans avoir à enlever un tas de caractères de connexion de chaque ligne.
0 votes
...(suite) Externaliser le SQL est également sous-optimal, car ces chaînes sont envoyées directement à une base de données de production sans aucune forme d'échappement. Je ne veux pas permettre à quelqu'un de modifier les requêtes qui sont envoyées à ma base de données sans une version complète, et encore moins sans arrêter et redémarrer mon application. Mais au-delà de cela, le SQL est un code, et je veux le voir dans mon code, et non pas avoir à extraire une ressource externe pour voir ce que le code Java va réellement faire lorsqu'il s'exécute - après avoir parcouru le fichier de ressources juste pour trouver la chaîne en question.
0 votes
Étant donné que les chaînes de caractères multilignes n'ont pas été implémentées dans Java 7, seriez-vous en mesure de modifier la réponse acceptée ?
0 votes
Non Si vous cherchez un support pour les chaînes de caractères multi-lignes dans l'IDE, économisez votre temps et ne vous embêtez pas à lire toutes les réponses. Il n'y a pas de moyen direct de le faire en Java. J'ai déjà lu toutes les réponses :)
0 votes
Il a finalement été intégré à Java 12. "Littératures de chaînes brutes". Il y a un billet de blog décent ici : vojtechruzicka.com/raw-strings
0 votes
Ce problème avec java est celui qui m'a finalement contraint à me procurer un langage jvm. Il est incroyablement frustrant de construire un programme de test ou une routine de configuration sans cette fonctionnalité. Heureusement,
scala
venait d'atteindre la majorité à cette époque (2013). Maintenant, je suis obligé d'utiliser à nouveau java et donc le désespoir revient (je ne peux pas compter sur la disponibilité de versions récentes de java).0 votes
Oh et
raw string literals
N'existent toujours pas, même dans Java13. Au lieu de cela, ils sonttext blocks
qui sont pas les mêmes . Ils n'autorisent pas les chaînes de caractères brutes non filtrées et ne prennent pas non plus en charge l'interpolation.