Java LanguageCordes


Introduction

Les chaînes ( java.lang.String ) sont des morceaux de texte stockés dans votre programme. Les chaînes ne sont pas un type de données primitif en Java , mais elles sont très courantes dans les programmes Java.

En Java, les chaînes sont immuables, ce qui signifie qu'elles ne peuvent pas être modifiées. (Cliquez ici pour une explication plus approfondie de l'immuabilité.)

Remarques

Les chaînes Java étant immuables , toutes les méthodes qui manipulent une String renvoient un nouvel objet String . Ils ne changent pas la String origine. Cela inclut les méthodes de sous-chaîne et de remplacement que les programmeurs C et C ++ pourraient modifier l'objet String cible.


Utilisez StringBuilder au lieu de String si vous souhaitez concaténer plus de deux objets String dont les valeurs ne peuvent pas être déterminées au moment de la compilation. Cette technique est plus performante que la création de nouveaux objets String et leur concaténation, car StringBuilder est mutable.

StringBuffer peut également être utilisé pour concaténer des objets String . Cependant, cette classe est moins performante car elle est conçue pour être thread-safe et acquiert un mutex avant chaque opération. Comme vous n'avez presque jamais besoin de sécurité des threads lors de la concaténation de chaînes, il est préférable d'utiliser StringBuilder .

Si vous pouvez exprimer une concaténation de chaîne en tant qu'expression unique, il est préférable d'utiliser l'opérateur + . Le compilateur Java convertira une expression contenant + concaténations en une séquence efficace d’opérations à l’aide de String.concat(...) ou StringBuilder . Le conseil d'utilisation de StringBuilder ne s'applique explicitement que lorsque la concaténation implique plusieurs expressions.


Ne stockez pas d'informations sensibles dans des chaînes. Si quelqu'un est capable d'obtenir un vidage de mémoire de votre application en cours d'exécution, il pourra alors trouver tous les objets String existants et lire leur contenu. Cela inclut les objets String inaccessibles et en attente de récupération de place. Si cela pose un problème, vous devrez effacer les données de chaîne sensibles dès que vous en avez terminé. Vous ne pouvez pas faire cela avec des objets String car ils sont immuables. Par conséquent, il est conseillé d'utiliser des objets char[] pour stocker des données de caractères sensibles et de les effacer (par exemple, les remplacer par des '\000' caractères) lorsque vous avez terminé.


Toutes les instances de String sont créées sur le tas, même les instances qui correspondent aux littéraux de chaîne. La particularité des littéraux de chaîne est que la machine virtuelle Java garantit que tous les littéraux égaux (c'est-à-dire constitués des mêmes caractères) sont représentés par un seul objet String (ce comportement est spécifié dans JLS). Ceci est implémenté par les chargeurs de classes JVM. Lorsqu'un chargeur de classe charge une classe, il recherche les littéraux de chaîne utilisés dans la définition de classe, chaque fois qu'il en voit un, il vérifie s'il existe déjà un enregistrement dans le pool de chaînes pour ce littéral (en utilisant le littéral comme clé). . S'il existe déjà une entrée pour le littéral, la référence à une instance String stockée en tant que paire pour ce littéral est utilisée. Sinon, une nouvelle instance String est créée et une référence à l'instance est stockée pour le littéral (utilisé comme clé) dans le pool de chaînes. (Voir aussi l' internat de chaînes ).

Le pool de chaînes est contenu dans le segment de mémoire Java et est soumis à une récupération de place normale.

Java SE 7

Dans les versions de Java antérieures à Java 7, le pool de chaînes était contenu dans une partie spéciale du tas appelée "PermGen". Cette partie n'a été collectée qu'occasionnellement.

Java SE 7

Dans Java 7, le pool de chaînes a été retiré de "PermGen".

Notez que les littéraux de chaîne sont implicitement accessibles depuis n'importe quelle méthode qui les utilise. Cela signifie que les objets String correspondants ne peuvent être récupérés que si le code lui-même est récupéré.


Jusqu'à Java 8, les objets String sont implémentés sous la forme d'un tableau de caractères UTF-16 (2 octets par caractère). Il existe une proposition dans Java 9 d'implémenter String comme un tableau d'octets avec un champ d'indicateur de codage à noter si la chaîne est codée sous forme d'octets (LATIN-1) ou de caractères (UTF-16).

Cordes Exemples Liés