bonjour,
pouvez-vous m'expliquer les différences entre ces écritures :
Code:
1
2 String s1 = new String("developpez.com"); String s2 = "developppez.com" ;
merciCode:
1
2
3 int[] tab1 = new int[]{1;2;3}; int[] tab2 = {1;2;3};
Version imprimable
bonjour,
pouvez-vous m'expliquer les différences entre ces écritures :
Code:
1
2 String s1 = new String("developpez.com"); String s2 = "developppez.com" ;
merciCode:
1
2
3 int[] tab1 = new int[]{1;2;3}; int[] tab2 = {1;2;3};
Salut,
Commençons par le cas du tableau de int :
Tout d'abord la bonne syntaxe c'est (avec des virgules pour séparer les éléments du tableau)Code:
1
2 int[] tab1 = new int[]{1;2;3}; int[] tab2 = {1;2;3};
Les deux lignes font la même chose exactement : elles créent un tableau de int, dimensionné à 3 éléments, et prérempli. La seconde écriture est juste une simplification de la première pour rendre l'initialisation à la déclaration plus concise (elle n'est d'ailleurs utilisable que lors d'une déclaration).Code:
1
2 int[] tab1 = new int[]{1,2,3}; int[] tab2 = {1,2,3};
Dans le cas du String, ce n'est pas la même chose.
La première ligne créé une nouvelle instance d'objet de type String, avec pour valeur "developpez.com".Code:
1
2 String s1 = new String("developpez.com"); String s2 = "developppez.com" ;
La seconde ligne affecte à s2 une valeur de chaîne créée dans un dictionnaire qui sera utilisé pour toute autre variable d'affectation identique.
Pour mieux te rendre compte de la différence, essaye avec :
Si tu exécutes les lignes suivantes avec ces variablesCode:
1
2
3
4 String s1 = new String("developpez.com"); String s2 = "developpez.com"; String s3 = new String("developpez.com"); String s4 = "developpez.com";
Tu obtiens :Code:
1
2
3
4 System.out.println("s1.equals(s2) : " + s1.equals(s2)); System.out.println("s1.equals(s3) : " + s1.equals(s3)); System.out.println("s1.equals(s4) : " + s1.equals(s4)); System.out.println("s2.equals(s4) : " + s2.equals(s4));
Normal, toutes ces chaînes sont bien égales.Citation:
s1.equals(s2) : true
s1.equals(s3) : true
s1.equals(s4) : true
s2.equals(s4) : true
Maitenant, au lieu de tester l'égalité, testons l'identité (on teste l'égalité des références d'objet, donc si c'est la même instance ou pas) :
On obtient :Code:
1
2
3
4 System.out.println("s1==s2 : " + (s1==s2)); System.out.println("s1==s3 : " + (s1==s3)); System.out.println("s1==s4 : " + (s1==s4)); System.out.println("s2==s4 : " + (s2==s4));
Les trois premiers résultats indiquent que s1, s2 et s3 référencent bien 3 instances différentes. Mais s4 référence la même instance que s2.Citation:
s1==s2 : false
s1==s3 : false
s1==s4 : false
s2==s4 : true
D'ailleurs, la plupart du temps, comme on ne sait pas comment a été instanciée une chaîne (comme on utilise des méthodes écrites par d'autres), on utilisera toujours equals() pour tester l'égalité de 2 variables de type String (même si le == pourrait marcher dans beaucoup de cas).
Note qu'avec
On obtiendra :Code:
1
2
3
4
5
6
7
8
9
10 String s1 = "developpez" + ".com"; String s2 = "developpez.com"; String s3 = "developpez"; String s4 = s3 + ".com"; String s5 = s3 + ".com"; System.out.println("s1==s2 : " + (s1==s2)); System.out.println("s1==s4 : " + (s1==s4)); System.out.println("s2==s4 : " + (s2==s4)); System.out.println("s4==s5 : " + (s4==s5));
En effet, le compilateur remplace la première ligne par un équivalent de la seconde, ce qui fait que les deux lignes font la même chose de la même façon et reviennent au même.Code:
1
2
3
4 s1==s2 : true s1==s4 : false s2==s4 : false s4==s5 : false
Alors que dans le cas de s4 (ou s5), on passe par un StringBuilder pour faire la concaténation, et la valeur affectée à la variable est créée par un new String() : ce qui explique que les instances soient différentes.