Déclaration de String en JAVA
javaazer
Messages postés
7
Statut
Membre
-
KX Messages postés 19031 Statut Modérateur -
KX Messages postés 19031 Statut Modérateur -
Bonjour,
Je veux déclarer une chaine de caractères de longueur 10 commençant par la lettre 'A'
public StringBuffer chaine=new StringBuffer(10);
chaine.append('A'); //ne marche pas !
S'il vous plait je veux savoir comment le réaliser !
Merci beaucoup !
Je veux déclarer une chaine de caractères de longueur 10 commençant par la lettre 'A'
public StringBuffer chaine=new StringBuffer(10);
chaine.append('A'); //ne marche pas !
S'il vous plait je veux savoir comment le réaliser !
Merci beaucoup !
A voir également:
- Longueur d'un string java
- Jeux java itel - Télécharger - Jeux vidéo
- Waptrick java football - Télécharger - Jeux vidéo
- Waptrick java voiture - Télécharger - Jeux vidéo
- Eclipse java - Télécharger - Langages
- Java apk - Télécharger - Langages
4 réponses
Tu dois faire la distinction entre la capacité et la taille d'une chaîne de caractères.
La capacité c'est le nombre de caractères qu'elle peut contenir et la taille c'est le nombre de caractères qu'elle contient effectivement.
La capacité d'un StringBuffer est ajustée dynamiquement au fur et à mesure qu'on en modifie le contenu. C'est d'ailleurs la différence avec un String qui a une capacité fixée à sa construction et qui ne peut pas être redimensionné. Lors de la modification de la taille d'un String, Java est obligé de construire un nouveau String avec la bonne capacité.
Si tu veux que la taille soit exactement de 10 caractères, tu dois préciser quels sont les 9 caractères suivants le 'A'. Ou alors tu peux faire un tableau de 10 caractères et laisser Java remplir par défaut les 9 derniers caractères (a priori par le caractère 0).
La confiance n'exclut pas le contrôle
La capacité c'est le nombre de caractères qu'elle peut contenir et la taille c'est le nombre de caractères qu'elle contient effectivement.
La capacité d'un StringBuffer est ajustée dynamiquement au fur et à mesure qu'on en modifie le contenu. C'est d'ailleurs la différence avec un String qui a une capacité fixée à sa construction et qui ne peut pas être redimensionné. Lors de la modification de la taille d'un String, Java est obligé de construire un nouveau String avec la bonne capacité.
StringBuffer chaine=new StringBuffer(10);
System.out.println(chaine.capacity()); // 10
System.out.println(chaine.length()); // 0
chaine.append('A');
System.out.println(chaine.capacity()); // 10
System.out.println(chaine.length()); // 1
chaine.append("0123456789");
System.out.println(chaine.capacity()); // 22 : ajustée dynamiquement
System.out.println(chaine.length()); // 11
Si tu veux que la taille soit exactement de 10 caractères, tu dois préciser quels sont les 9 caractères suivants le 'A'. Ou alors tu peux faire un tableau de 10 caractères et laisser Java remplir par défaut les 9 derniers caractères (a priori par le caractère 0).
String str1 = "A_________"; System.out.println(str1.length()); // 10 char[] tab = new char[10]; // Remarque : on utilise souvent byte[] tab[0]='A'; String str2 = new String(tab); System.out.println(str2.length()); // 10
La confiance n'exclut pas le contrôle
Salut,
Ou bien par exemple:
Cordialement,
Dan
Ou bien par exemple:
StringBuffer chaine=new StringBuffer(10);
chaine.append('A'); //ne marche pas !
System.out.println("chaine: " + "\"" + chaine + "\"");
for(int i = 0; i < chaine.capacity() -2; i++) // -2 car A existe
chaine.append(i); // ou tout autre caractère
System.out.println("chaine: " + "\"" + chaine + "\"");
Cordialement,
Dan
Tu as un problème dans ta boucle, au final tu obtient une chaîne de taille 9 et pas 10.
De plus rajouter un int est bizarre, ça va bien se passer tant que ce sera des chiffres.
Au delà il va rajouter à chaque fois autant de caractères qu'il y a de chiffres et ça va planter.
Avec ton code :
Si on initialise à 10 : chaine: "A01234567" // 9 caractères
Si on initialise à 13 : chaine: "A012345678910" // ici on a ajouté 2 caractères pour 10
Si on initialise à 14 : java.lang.OutOfMemoryError: Java heap space
Voici comment réparer ce bug dans le cas général :
De plus rajouter un int est bizarre, ça va bien se passer tant que ce sera des chiffres.
Au delà il va rajouter à chaque fois autant de caractères qu'il y a de chiffres et ça va planter.
Avec ton code :
Si on initialise à 10 : chaine: "A01234567" // 9 caractères
Si on initialise à 13 : chaine: "A012345678910" // ici on a ajouté 2 caractères pour 10
Si on initialise à 14 : java.lang.OutOfMemoryError: Java heap space
Voici comment réparer ce bug dans le cas général :
for (int i=chaine.length(); i<chaine.capacity(); i++)
chaine.append('_');
System.out.println(chaine.length()+"=="+chaine.capacity());
Oui effectivement on obtient : chaine: "A01234567".
J'ai copié mon premier code aulieu de celui-ci:
J'ai ajouté un autre cas...
Dan
J'ai copié mon premier code aulieu de celui-ci:
StringBuffer chaine=new StringBuffer(10);
chaine.append('A');
System.out.println("chaine: " + "\"" + chaine + "\"");
for(int i = 0; i < chaine.capacity() -1; i++) // soit < 9 car A existe déjà
chaine.append(i); // ou tout autre caractère
System.out.println("chaine: " + "\"" + chaine + "\"");
// ou bien
StringBuffer chaine2 = new StringBuffer(10);
chaine2.append('A');
System.out.println("chaine2: " + "\"" + chaine2 + "\"");
chaine2.append("BCDEFGHIJ"); // ou tout autre caractère
System.out.println("chaine2: " + "\"" + chaine2 + "\"");
J'ai ajouté un autre cas...
Dan
Là encore, ton append(i) marchera parce qu'on est en dessous de 10 et qu'il n'y a qu'un chiffre, mais au delà se sera une suite de chiffres, donc une suite de caractères et ça va planter comme je l'avais montré dans mon exemple précédent (à partir de 12 avec ce code)
Cela vient du fait que l'ajustement dynamique de StringBuffer augmente la capacité de la chaîne de caractères pour pouvoir ajouter tous les chiffres de i, mais vu la condition d'arrêt du for on rentre alors dans une boucle infinie jusqu'à atteindre l'erreur OutOfMemory...
Plutôt que d'utiliser append(i) considère soit append(i%10) soit append((char)i) qui tous deux rajoutent un unique caractère à chaque fois, quelque soit la valeur de i (positive !)
Cela vient du fait que l'ajustement dynamique de StringBuffer augmente la capacité de la chaîne de caractères pour pouvoir ajouter tous les chiffres de i, mais vu la condition d'arrêt du for on rentre alors dans une boucle infinie jusqu'à atteindre l'erreur OutOfMemory...
Plutôt que d'utiliser append(i) considère soit append(i%10) soit append((char)i) qui tous deux rajoutent un unique caractère à chaque fois, quelque soit la valeur de i (positive !)
Je ne nie pas que ça marche, d'ailleurs je l'ai dit "marchera parce qu'on est en dessous de 10"
Mais si demain javaazer veut utiliser le même code pour une chaîne de 15 caractères ça ne marchera plus, et j'apporte juste un complément à ton code pour expliquer pourquoi ça ne marcherait pas dans le cas général. CommentCaMarche est un forum d'entraide, c'est dans ce sens que je l'utilise.
Mais si demain javaazer veut utiliser le même code pour une chaîne de 15 caractères ça ne marchera plus, et j'apporte juste un complément à ton code pour expliquer pourquoi ça ne marcherait pas dans le cas général. CommentCaMarche est un forum d'entraide, c'est dans ce sens que je l'utilise.