les objets sont passés par référence, les primitives sont passés par valeur.
La chaîne n'est pas un primitif, c'est un objet, et c'est un cas particulier de l'objet.
C'est pour l'économie de mémoire but. Dans la JVM, il y a une chaîne de la piscine. Pour chaque chaîne créée, JVM va essayer de voir si la même chaîne existent dans la chaîne de la piscine, et le point à elle si il y avait déjà un.
public class TestString
{
private static String a = "hello world";
private static String b = "hello world";
private static String c = "hello " + "world";
private static String d = new String("hello world");
private static Object o1 = new Object();
private static Object o2 = new Object();
/**
* @param args
*/
public static void main(String[] args)
{
// TODO Auto-generated method stub
System.out.println("a==b:"+(a == b));
System.out.println("a==c:"+(a == c));
System.out.println("a==d:"+(a == d));
System.out.println("a.equals(d):"+(a.equals(d)));
System.out.println("o1==o2:"+(o1 == o2));
passString(a);
passString(d);
}
public static void passString(String s)
{
System.out.println("passString:"+(a == s));
}
}
a==b:true
a==c:true
a==d:false
a.equals(d):true
o1==o2:false
passString:true
passString:false
l' == est la vérification de l'adresse de mémoire (de référence), et l' .est égale à la vérification du contenu (valeur)