
|
auteur :
Clément Cunin | Avant d'essayer de comparer deux chaînes de caractères, il faut bien comprendre que l'opérateur '==' permet de comparer entre eux les types primitifs (int, float, boolean, etc. ) mais dans le cas des objets, cet opérateur compare les emplacements mémoire des objets : deux instances initialisées avec les mêmes paramètres occupent un espace mémoire différent, elles sont donc différentes du point de vue de '=='. L'opération qui permet de comparer les objets entre eux est la méthode equals() de java.lang.Object.
String a = "coucou";
String b = "coucou";
String c = "bonjour";
String d = c;
a==b;
/** FAUX, a et b sont des instances différentes de String.
* Ce résultat est théorique, car certains compilateurs pourraient optimiser
* le code pour ne créer qu'une seule instance mémoire
*/
a.equals(b);
c==d;
JDK 1.4, méthode 'intern()' Le JDK 1.4 vient un peu compliquer la chose en conservant une liste privée d'instances de String. Initialement, la liste est vide. L'appel de la méthode intern() cherche dans la liste si une instance est égale d'après 'equals()', si oui, cette instance est retournée, sinon la chaîne est ajoutée à la liste.
String a = "coucou";
String b = "coucou";
a=a.intern();
b = b.intern();
a==b;
|
|
auteur :
Clément Cunin | Méthode parseXXX() La conversion de chaînes de caractères en valeurs numériques est assurée par les différentes classes de gestion des types de base de Java : java.lang.Integer, java.lang.Double, java.lang.Float, java.lang.Long, java.lang.Byte. La chaîne ne doit contenir que le nombre à convertir : toute erreur lève l'exception java.lang.NumberFormatException.
int i = Integer.parseInt(maString);
long l = Long.parseLong(maString);
byte b = Byte.parseByte(maString);
Méthode XXXXFormat.parse(pattern) Une autre méthode, plus lourde mais
aussi plus flexible consiste à utiliser un Formatter pour parser la chaîne en nombre. Cette méthode vous permet
de parser les nombres en tenant compte de l'internationalisation du séparateur décimal.
NumberFormat monFormatteurDeNombre = NumberFormat.getInstance();
String maChaine = "1053,52";
double resultat = monFormatteurDeNombre.parse(maChaine).doubleValue();
|
lien : Comment convertir un nombre en chaîne ?
|
|
auteur :
L'équipe Java | Dans un premier temps, on crée un objet java.text.DecimalFormat, puis on utilise cet objet pour convertir chaque valeur en chaîne de caractères.
Exemple de conversion d'un réel avec seulement 2 décimales :
DecimalFormat df = new DecimalFormat("########.00");
System.out.println(df.format(mon_nombre));
|
lien : Comment convertir un nombre en chaîne ?
|
|
auteur :
Clément Cunin | La conversion d'une date en chaîne de caractères est délicate au premier abord. En effet, le format des dates est très différent d'une langue à l'autre. Heureusement, les fonctions d'internationalisation de Java vont faire le travail à notre place...
import java.util.Locale;
import java.text.DateFormat;
Locale locale = Locale.getDefault();
/** 2. Construction du DateFormat en choisiant un format :
* SHORT = 01/01/2002
* FULL = lundi 1 janvier 2002
*/
DateFormat dateFormat = DateFormat.getDateInstance(DateFormat.FULL, locale);
System.out.println(dateFormat.format(maDate));
Si vous souhaitez utiliser un format de sortie plus exotique, vous pouvez accéder directement à la classe java.text.SimpleDateFormat.
DateFormat dateFormat = new SimpleDateFormat("hh'h'mm dd-MM-yy");
|
lien : Comment convertir une date en chaîne ?
|
|
auteur :
Grégory Danelon | Pour convertir une chaine en date, il faut connaître le format de la date. Par défaut, une seule classe dans l'API gère les formats de date : java.text.SimpleDateFormat. On utilise le parser de date pour effectuer la conversion. Voici une méthode générique :
public static Date stringToDate(String sDate, String sFormat) throws Exception {
SimpleDateFormat sdf = new SimpleDateFormat(sFormat);
return sdf.parse(sDate);
}
Le parser déclenche l'exception ParseException quand la chaine ne respecte pas le format. La documentation sur java.text.SimpleDateFormat décrit le format d'une date, et des lettres à utiliser pour caractériser le jour, le mois, ... etc. Cette méthode est valable à partir du JDK 1.1 Un exemple d'utilisation est fourni en téléchargement.
|
lien : How can I convert a date in String format to a Date object ?
lien : Comment convertir une date en chaîne ?
téléchargement : Exemple d'utilisation.
|
|
auteur :
Clément Cunin | Définition du type char : Le type 'char' de Java est un type primitif, codé sur 16 bits, qui contient la valeur unicode du caractère. De plus, le type 'char' est un entier non-signé qui peut contenir des valeurs de 0-65535; Toutes les opérations arithmétiques sont légales ( voir Les spécifications du langage Java ).
Conversion en ASCII : La manière la plus simple de passer de l'Unicode à l'ASCII est d'utiliser la classe java.lang.String.
try {
String chaine = "Ma chaîne à traduire !";
byte[] bytes = chaine.getBytes("ASCII");
for( int i=0; i<bytes.length; i++ ) {
System.out.println( bytes[i] );
}
} catch( java.io.UnsupportedEncodingException e ) {
e.printStackTrace();
}
Conversion dans d'autres formats : Quelques autres formats d'encodage sont gérés par Java en interne : US-ASCII, ISO-8859-X (1 à 7), UTF-8, UTF-16BE, UTF-16LE, UTF-16. (voir la classe java.nio.charset.Charset pour plus d'informations)
|
lien : Encodage des bytes et des chaines
lien : Convertion des textes Non-Unicode
|
|
auteur :
cyberzoide | Pour faire cela, on peut utiliser le constructeur de String prenant en paramètre l'encodage.
Voici un exemple permettant de convertir une chaîne codée en UTF-8 en ISO-8859-1 (Latin 1, français)
String stringUTF8 = ... ;
String stringISO = new String ( stringUTF8.getBytes(), "ISO-8859-1" );
|
|
auteurs :
Clément Cunin, Jean-Baptiste Bugeaud | JDK 1.0 : Il faut utiliser un objet java.util.StringTokenizer qui permet aisément de découper une chaîne en sous-chaînes séparées par des délimiteurs que l'on peut préciser.
JDK 1.4 : Le JDK 1.4 apporte la gestion des expressions régulières, le découpage d'une chaîne est maintenant possible directement de la classe java.lang.String grâce à la méthode split(java.lang.String regex).
|
|
auteur :
Johann Heymes | Rien de plus facile ! Java utilise la norme Unicode pour gérer les chaînes de caractères. Il suffit donc de se reférer au site http://www.unicode.org/charts/ et d'utiliser le code proposé sous le caractère souhaité.
Exemple : Nous désirons afficher dans notre application le caractère ࢘ . Il s'agit d'un caractère de type mathématique. Une rapide étude de la liste Mathematical Operators nous permet de trouver le code 2200.
monJTextArea.append( "\u2200 le caractère unicode Java le connait." );
Attention : Le résultat de l'affichage d'un caractère bizarre dans une console sous Windows ou sous Linux dépend de l'encodage supporté par la console ; dans la pratique cela marche rarement.
|
lien : Le site du Consortium Unicode
lien : La page proposant les listes
téléchargement : Exemple d'implémentation.
|
|
auteur :
Clément Cunin | Les chaînes de caractères ne sont pas vraiment limitées en java. On notera cependant que les caractères de la chaîne sont indexés par des 'int', ce qui nous fixe une limite à 2^32 caractères (soit une chaîne de plus de 4Go en mémoire).
Note : Attention, si vous manipulez des chaînes (modification, concaténation, etc ...) et à plus forte raison des chaînes de grande taille, vous devez utiliser des java.lang.StringBuffer ( en savoir plus).
|
lien : Comment concatener des chaînes de caractères ?
|
|
auteur :
Clément Cunin | Théoriquement, chaque fois que l'on doit créer ou modifier une chaîne par concaténation. Dans la pratique, il est nécessaire de bien comprendre comment Java gère les chaînes de caractères et les concaténations pour manipuler efficacement les chaînes.
La classe String : En Java, une instance de la classe String est dite non-mutable, c'est à dire qu'après avoir été créée, la chaîne ne peut plus être modifiée. Cela s'avère très pratique dans beaucoup de situations : inutile par exemple de dupliquer une instance de String pour s'assurer qu'elle restera constante (comme c'est le cas en C++ par exemple). Mais cette propriété se révèle désastreuse avec l'emploi de l'opérateur '+' pour la concaténation de chaîne, car chaque étape de la concaténation implique la construction d'une nouvelle instance de String.
String resultat = "";
for( int i=0; i<10; i++) {
resultat = resultat + i;
}
System.out.println(resultat);
Lors de l'éxecution de ce programme, chaque itération de la boucle construit une nouvelle instance de String. Chaque itération oblige donc la JVM à trouver de la place en mémoire, instancier l'objet, copier le contenu des 2 chaînes dans la nouvelle, libérer la mémoire, recommencer à l'itération suivante. Cela revient à créer 10 instances de String pour les résultats intermédiaires.
La classe StringBuffer : La classe java.lang.StringBuffer est une classe qui gère une chaîne modifiable. Cette classe a été spécialement conçue pour manipuler des chaînes de caractères...
StringBuffer sb = new StringBuffer(20);
for( int i=0; i<10; i++) {
sb.append(i);
}
System.out.println(sb.toString());
Ce code produit exactement le même résultat que le précédent, sauf qu'il instancie un seul objet là où 10 étaient nécessaires.
La classe StringBuffer : Depuis J2SE 5.0 (Tiger), vous pouvez aussi utiliser la classe StringBuilder (du package java.lang). Son fonctionnement est identique à celui de StringBuffer à la différence qu'il n'est pas "thread-safe". Si vous n'avez pas besoin de synchronization (comme c'est souvent le cas), préférez StringBuilder car il sera plus performant.
Note : Si vous ne précisez pas la taille maximale ou que vous sous-estimez cette taille, StringBuffer/StringBuilder recréera automatiquement son tableau de caractères pour pouvoir accueillir votre texte, mais cette option est aussi coûteuse que la création d'une instance de String, il convient donc de choisir intelligemment cette valeur.
|
|
auteur :
duj | Si vous essayez ceci :
System.out.println(1.3-1.2);
Vous obtenez : 0.10000000000000009 au lieu de 0.1 , comme indiqué sur votre calculatrice.
En fait, il est impossible de représenter exactement 0.1 ou n'importe quelle puissance négative de 10 au moyen d'un float ou d'un double.
La meilleure solution pour résoudre ce problème est d'utiliser la classe java.math.BigDecimal.
On l'utilise par exemple comme ceci:
BigDecimal bd1 = new BigDecimal("1.3");
BigDecimal bd2 = new BigDecimal("1.2");
System.out.println(bd1.substract(bd2));
Attention, les chiffres que vous voulez représenter doivent être passés comme des Strings dans le constructeur
|
|
auteurs :
Clément Cunin, Johann Heymes | Arrondir un réel en entier : Lors d'une conversion d'un réel en entier par une opération d'affection, Java se contente de tronquer la partie décimale.
double a = 1.99;
int b = a;
Un solution consiste à simplement incrémenter la valeur réelle de 0.5 avant la conversion.
double a = 1.8;
int b = a+0.5;
Arrondir un réel à 10^-2 : On peux également faire un arrondi à 10^-2 à la main en faisant:
double a = 1.6666666
a *= 100;
a = (int)(a+.5);
a /= 100;
Il est très important de commenter ce genre d'astuce de programmation; dans le cas contraire votre code pourrait rapidement devenir imcompréhensible !
La classe java.lang.Math : La classe Math fournit un certain nombre de méthodes pour faire les arrondis (inférieur, supérieur ou au plus proche). Elles ont l'avantage d'être plus lisibles que le code fourni précédemment. En revanche, rien n'est prévu pour l'arrondi à 10^-2.
Arrondir pour afficher : En revanche, si le résultat est destiné à une conversion en chaîne de caractères, on peux faire beaucoup mieux grâce à la classe java.text.DecimalFormat (plus d'info ici)
|
lien : Comment convertir un nombre en chaîne formatée ?
|
|
auteur :
Ioan Calapodescu | Voici la description de trois "outils" pouvant vous permettre de faire des calculs mathématiques. Les deux premiers sont des classes faisant partie du JDK standard, le dernier est une API appartenant au projet Jakarta Commons.
- Math (package java.lang) : La classe Math contient un ensemble de méthodes statiques permettant de faire des opérations numériques basiques (logarithmes, exponentielles ou fonctions trigonométriques). Contrairement à la classe StrictMath, les différentes implémentations d'une même méthode ne donnent pas le même résultat "bit à bit". On peut quand même noter que, en général, les implémentations des méthodes de la classe Math font appel aux méthodes de StrictMath. Si la précision n'est pas le critère primordial, vous pouvez préférer Math à StrictMath pour des raisons de performance.
- StrictMath (package java.lang) : Les méthodes de StrictMath sont les mêmes que celles de Math, à la différence que les résultats obtenus sont les mêmes que ceux produits par la fdlibm (Freely Distributable Math Library). Plus d'informations dans la description de la classe StrictMath : http://java.sun.com/j2se/1.5.0/docs/api/java/lang/StrictMath.html
- Math 1.0 (Jakarta Commons) : Cette API (disponible à cette adresse : http://jakarta.apache.org/commons/math/) met à la disposition du développeur Java un plus grand nombre d'algorithmes mathématiques et statistiques. Plus d'informations dans la documentation : http://jakarta.apache.org/commons/math/userguide/index.html
|
Consultez les autres F.A.Q's
Les codes sources présentés sur cette page sont libres de droits, et vous pouvez les utiliser à votre convenance. Pour le reste, ce document constitue une oeuvre intellectuelle protégée par les droits d'auteurs.
Ce document issu de http://www.developpez.com est soumis à deux licences, en fonction des contributeurs :
- Les contributions de Clément Cunin et Johann Heymes sont soumises aux termes de la la licence GNU FDL traduite en français ici. Permission vous est donnée de distribuer, modifier des copies des contributions de Clément Cunin et Johann Heymes tant que cette note apparaît clairement :
"Ce document issu de http://www.developpez.com est soumis à la licence GNU FDL traduite en français ici. Permission vous est donnée de distribuer, modifier des copies de cette page tant que cette note apparaît clairement".
- Pour ce qui est des autres contributions : Copyright © 2004 Developpez LLC : Tous droits réservés Developpez LLC. Aucune reproduction, ne peux en être faite sans l'autorisation expresse de Developpez LLC. Sinon vous encourez selon la loi jusqu'à 3 ans de prison et jusqu'à 300 000 E de dommages et intérêts. Cette page est déposée à la SACD.
|
|
|