1
votes

Pourquoi la chaîne retournée par String.toLowerCase () n'est pas internée?

On m'a demandé de prédire la sortie de ce code:

String party1 = "party";
String party2= "PARTY".toLowerCase();
if(party1==party2){
   System.out.println("EQUAL");
}else{
   System.out.println("NOT EQUAL");
}

Je pensais que le résultat de toLowerCase () serait interné automatiquement et donc la même référence à party1 serait renvoyé, mais je me suis trompé car le code sort "NOT EQUAL" .
toLowerCase () ( toUpperCase () également) renvoie-t-il une nouvelle String ?

Modifier : je n'utilise pas == pour comparer des chaînes, je veux juste connaître le comportement de la méthode toLowerCase ()


6 commentaires

Pourquoi vous attendiez-vous à ce qu'il ne renvoie pas une nouvelle chaîne?


Ne vous fiez jamais, jamais à == pour la comparaison de chaînes.


Copie possible de Comment comparer des chaînes en Java?


"Je pensais que le résultat de toLowerCase () serait automatiquement interné" - Qu'est-ce qui vous a fait penser cela?


@a_horse_with_no_name J'utilise equals () à cette fin, ma question portait sur l'implémentation spécifique de toLowerCase ()


«Je pensais que le résultat de toLowerCase () serait automatiquement interné» Voulez-vous dire que vous pensiez qu'une instance de la chaîne serait renvoyée à partir du pool de chaînes s'il en existe une? Si c'est le cas, non: il n'y a pas de mécanisme (public) pour demander si une chaîne existe dans le pool de chaînes, autrement qu'en appelant intern () et en voyant si la même chaîne revient.


4 Réponses :


0
votes

À ma connaissance sur toutes les opérations sur la chaîne, il dupliquera la chaîne donc n'utilisez jamais '==' à la place utilisez .equals ()

String party1 = "party";
        String party2= "PARTY".toLowerCase();
        System.out.println(party1);
        System.out.println(party2);
        if(party1.equals(party2)){
           System.out.println("EQUAL");
        }else{
           System.out.println("NOT EQUAL");
        }

Cela a donné le résultat égal


0 commentaires

2
votes

La réponse est dans la méthode String.toLowerCase () elle-même .. comme vous pouvez le vérifier par votre propre méthode toLowerCase () renvoie une nouvelle chaîne en minuscules (un nouvel objet String ) et == vérifie la référence de l'objet et renvoie true si ce sont les mêmes qui sont différents dans votre cas .. c'est pourquoi il renvoie false .. j'espère que vous l'obtiendrez.

public String toLowerCase(Locale locale) {
    if (locale == null) {
        throw new NullPointerException();
    }
    ........

    ............

    return new String(result, 0, len + resultOffset);
}


0 commentaires

5
votes

Si le résultat d'une opération String était internalisé, le pool croîtrait extrêmement et inutilement rapidement. Toute action intermédiaire sur un Spring entraînerait un nouvel élément dans le pool. Ce serait bénéfique pour un TRÈS petit nombre de cas dans un domaine TRÈS spécifique. Par conséquent, ce n'est pas la politique par défaut et c'est pourquoi intern () existe.

String party1 = "party";
String party2 = "PARTY".toLowerCase().intern();
System.out.println(party1 == party2 ? "EQUAL" : "NOT EQUAL");

Il n'y a rien de spécial à propos de toLowerCase () : tout La méthode String renverrait une nouvelle String car les String sont immuables.


0 commentaires

1
votes

Les chaînes sont immuables. En général, chaque fois que nous essayons de modifier une chaîne, un nouveau littéral de chaîne est créé dans le pool de littéraux constants et une nouvelle référence à celui-ci est retournée. c'est-à-dire parti mais en pool constant, ils se réfèrent à deux littéraux différents et ont deux références différentes. En utilisant l'opérateur == , vous comparez les références et non les valeurs. Comme elles ont des références différentes, il imprime NOT Equal . Essayez avec party1.equals (party2) < / code> et il affichera EQUAL car il compare le contenu et non la référence.

 Réserve littérale constante et ses références


0 commentaires