10
votes

Java: Pourquoi peut-on prouver l'égalité de cordes?

J'ai appris que c'est du diable pour tester l'égalité des chaînes avec == au lieu de string.equals () , car chaque chaîne était une référence à son propre objet .

mais si j'utilise quelque chose comme xxx

IT imprime true.

Pourquoi?


3 commentaires

Jeter un coup d'œil sur Stackoverflow.com/questions/1091045/... . Ils discutent également de cette question.


Veuillez poster un exemple qui montre comment "cela fonctionne maintenant".


Quelle amusant cela est venu - j'enversais {string == null? "": String} - Tous mes tests ont passé, mais quand les chaînes ont commencé à être lues de la base de données ...


3 Réponses :


26
votes

Ce n'est pas le cas. C'est toujours une mauvaise chose à faire - vous serez toujours tester l'égalité de référence au lieu d'égalité de valeur.

public class Test
{
    public static void main(String[] args)
    {
        String x = "hello";
        String y = "hel" + "lo"; // Concatenated at compile-time
        System.out.println(x == y); // Prints true
    }
}


1 commentaires

Merci - mais pourquoi travaille-t-il si j'utilise deux littéraux identiques?



3
votes

Cela n'a pas changé. Cependant, le compilateur Java utilise String.Intern () pour vous assurer que les chaînes identiques du code source compilent vers un même objet de chaîne. Si toutefois, vous chargez une chaîne à partir d'un fichier ou d'une base de données, il ne sera pas le même objet, à moins que vous ne forciez cela à l'aide de String.Intern () ou d'une autre méthode.

C'est une mauvaise idée et vous devez toujours utiliser des angles ()


2 commentaires

Les objets de chaîne interne manuellement sont risqués car ils ne peuvent jamais être internes ni déchets collectés. On pourrait facilement consommer toute la mémoire disponible de cette façon.


@Adriaan - Les chaînes internées inaccessibles sont des ordures recueillies. Cela a été apparemment mis en œuvre dans JDK 1.2.



1
votes

look, c'est un concept délicat.

Il y a une différence entre: p> xxx pré>

et p> xxx pré>

si vos chaînes étaient des objets, c'est-à-dire p> xxx pré>

Ensuite, deux objets différents auraient été créés dans le pool de cordes dans deux emplacements de mémoire différents et faire P>

a.substring(2, 5).equals(b);
b.equals(c);


0 commentaires