Un extrait de conférence avec un mentor dans le cadre du cours Codegym University. Inscrivez-vous au cours complet.


"Salut, Amigo ! Aujourd'hui, nous allons analyser quelques scénarios plus courants impliquant de travailler avec des chaînes. Par exemple, savez-vous comment diviser une chaîne en plusieurs parties ?"

« Je ne vais pas te le dire tout de suite, Ellie. Mais tu vas me le dire, n'est-ce pas ?

split()méthode

"Il y a plusieurs façons de procéder. La première façon de diviser une chaîne en plusieurs parties est d'utiliser la split()méthode. Une expression régulière qui définit une chaîne de délimitation spéciale doit être passée en paramètre. Vous apprendrez ce qu'est une expression régulière dans la quête Collections Java .

Exemple:

Code Résultat
String str = "Good news everyone!";
String[] strings = str.split("ne");
System.out.println(Arrays.toString(strings));
Le résultat sera un tableau de trois chaînes :
["Good ", "ws everyo", "!"]

Simple, mais parfois cette approche est excessive. S'il y a beaucoup de délimiteurs (par exemple, des espaces, des sauts de ligne, des tabulations, des points), alors vous devez construire une expression régulière plutôt complexe."

"Eh bien, bien sûr. Et si c'est difficile à lire, alors il est difficile d'apporter des modifications.

StringTokenizerclasse

Un extrait de conférence avec un mentor dans le cadre du cours Codegym University. Inscrivez-vous au cours complet.


"Java a une classe spéciale dont le travail consiste à diviser une chaîne en sous-chaînes.

"Cette classe n'utilise pas d'expressions régulières : à la place, vous transmettez simplement une chaîne composée de délimiteurs. L'avantage de cette approche est qu'elle ne divise pas la chaîne entière en morceaux d'un seul coup, mais se déplace plutôt du début à la fin. étape à la fois.

La classe a un constructeur et deux méthodes. Nous passons au constructeur une chaîne que nous divisons en parties et une chaîne composée d'un ensemble de caractères de délimitation.

Méthodes Description
String nextToken()
Renvoie la sous-chaîne suivante
boolean hasMoreTokens()
Vérifie s'il existe d'autres sous-chaînes.

"Cette classe me rappelle en quelque sorte la classe Scanner, qui a aussi des méthodes nextLine()et hashNextLine().

"C'est une bonne observation que vous avez faite. Vous pouvez créer un StringTokenizerobjet avec cette commande :

StringTokenizer name = new StringTokenizer(string, delimiters);

Où chaîne est la chaîne à diviser en parties. Et délimiteurs est une chaîne, et chaque caractère qu'il contient est traité comme un délimiteur. Exemple:

Code Sortie console
String str = "Good news everyone!";

StringTokenizer tokenizer = new StringTokenizer(str,"ne");
while (tokenizer.hasMoreTokens())
{
   String token = tokenizer.nextToken();
   System.out.println(token);
}
Good 
ws 
v
ryo
!

"Notez que chaque caractère de la chaîne passée dans la deuxième chaîne au StringTokenizerconstructeur est considéré comme un séparateur.

String.format()méthode et StringFormatterclasse

"Une autre méthode intéressante de la classe String est format().

"Supposons que vous ayez diverses variables stockant des données. Comment les affichez-vous à l'écran sur une seule ligne ? Par exemple, nous avons des données (colonne de gauche) et la sortie souhaitée (colonne de droite) :

Code Sortie console
String name = "Amigo";
int age = 12;
String friend = "Diego";
int weight = 200;
User = {name: Amigo, age: 12 years, friend: Diego, weight: 200 kg.}

Le code d'un tel programme ressemblera à ceci :

Code programme
String name = "Amigo";
int age = 12;
String friend = "Diego";
int weight = 200;

System.out.println("User = {name: " + name + ", age:" + age + " years, friend: " + friend+", weight: " + weight + " kg.}");

« Vous conviendrez avec moi que le code n'est pas très lisible. Et si les noms des variables étaient plus longs, alors le code deviendrait encore plus difficile :

Code programme
String name = "Amigo";
int age = 12;
String friend = "Diego";
int weight = 200;

System.out.println("User = {name: " + user.getName() + ", age:" + user.getAge() + " years, friend: " + user.getFriends().get(0) + ", weight: " + user.getExtraInformation().getWeight() + " kg.}");

"Oui, c'est une lecture difficile !"

"Ne vous inquiétez pas. C'est une situation courante dans les programmes du monde réel, donc je veux vous parler d'un moyen d'écrire ce code plus simplement et de manière plus concise.

String.format

"La Stringclasse a une méthode statiqueformat() : elle permet de spécifier un modèle pour assembler une chaîne avec des données. L'apparence générale de la commande est la suivante :

String name = String.format(pattern, parameters);

Exemple:

Code Résultat
String.format("Age=%d, Name=%s", age, name);
Age=12, Name=Amigo
String.format("Width=%d, Height=%d", width, height);
Width=20, Height=10
String.format("Fullname=%s", name);
Fullname=Diego

"Le format()premier paramètre de la méthode est une chaîne de format qui contient tout le texte souhaité ainsi que des caractères spéciaux appelés spécificateurs de format (tels que %det %s) aux endroits où vous devez insérer des données.

"La format()méthode remplace ces spécificateurs de format %set %dpar les paramètres qui suivent la chaîne de format dans la liste de paramètres. Si nous voulons insérer une chaîne, nous écrivons . %sSi nous voulons insérer un nombre, le spécificateur de format est %d. Exemple :

Code Résultat
String s = String.format("a=%d, b=%d, c=%d", 1, 4, 3);
sest égal à"a=1, b=4, c=3"

"Voici une courte liste de spécificateurs de format pouvant être utilisés dans la chaîne de format :

Prescripteur Signification
%s
String
%d
nombre entier : byte, short, int,long
%f
nombre réel : float,double
%b
boolean
%c
char
%t
Date
%%
%personnage

"Ces spécificateurs indiquent le type de données, mais il existe également des spécificateurs qui indiquent l'ordre des données. Pour obtenir un argument par son numéro (la numérotation commence à partir de un), il faut écrire " % 1$ d " au lieu de " %d ". Exemple :

Code Résultat
String s = String.format("a=%3$d, b=%2$d, c=%d", 11, 12, 13);
sest égal à"a=13, b=12, c=11"

%3$dobtiendra le 3ème argument, %2$dobtiendra le deuxième argument et %dobtiendra le tout premier argument. Les spécificateurs de format %set %dfont référence à des arguments indépendamment des spécificateurs tels que %3$dou%2$s

Piscine à cordes

"Chaque chaîne spécifiée dans le code en tant que littéral de chaîne est stockée dans une zone de mémoire appelée pendant l' StringPoolexécution du programme. StringPoolest un tableau spécial pour stocker les chaînes. Son but est d'optimiser le stockage des chaînes :

"Tout d'abord, les chaînes spécifiées dans le code doivent être stockées quelque part, n'est-ce pas ? Le code se compose de commandes, mais les données (en particulier les grandes chaînes) doivent être stockées en mémoire séparément du code. Seules les références aux objets chaîne apparaissent dans le code.

"Deuxièmement, tous les littéraux de chaîne identiques ne doivent être stockés en mémoire qu'une seule fois. Et c'est ainsi que cela fonctionne. Lorsque votre code de classe est chargé par la machine Java, tous les littéraux de chaîne sont ajoutés au s'ils n'y sont pas déjà. S'ils le StringPoolsont déjà là, alors nous utilisons simplement une référence de chaîne à partir du fichier StringPool.

Ainsi, si vous affectez le même littéral à plusieurs variables String dans votre code, alors ces variables contiendront la même référence. Un littéral ne sera ajouté qu'une StringPoolseule fois. Dans tous les autres cas, le code obtiendra une référence à la chaîne déjà chargée dans le fichier StringPool.

Voici en gros comment ça marche :

Code Travailler avec StringPoll
String a = "Hello";
String b = "Hello";
String c = "Bye";
String[] pool = {"Hello", "Bye"};
a = pool[0];
b = pool[0];
c = pool[1];

"C'est pourquoi les variables aet bstockeront les mêmes références."

"J'espère que j'ai bien tout compris.

intern()méthode.

"Et la meilleure partie est que vous pouvez ajouter par programmation n'importe quelle chaîne au StringPool. Pour ce faire, il vous suffit d'appeler la méthode Stringde la variable intern().

"La intern()méthode ajoutera la chaîne au StringPoolsi elle n'y est pas déjà et renverra une référence à la chaîne dans le StringPool.

"Et que se passera-t-il si deux chaînes identiques sont ajoutées à l' StringPoolaide de la intern()méthode ?"

"La méthode renverra les mêmes références. Cela peut être utilisé pour comparer des chaînes par référence. Exemple :

Code Note
String a = new String("Hello");
String b = new String("Hello");
System.out.println(a == b);


false
String a = new String("Hello");
String b = new String("Hello");

String t1 = a.intern();
String t2 = b.intern();
System.out.println(a == b);
System.out.println(t1 == t2);





false
true

Il est peu probable que vous utilisiez souvent cette méthode. Cela dit, les gens aiment poser des questions à ce sujet lors des entretiens d'embauche.

"Donc, il vaut mieux le savoir que de ne pas le savoir. Merci, Ellie!"