IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

avec Java Discussion :

Test de chaînes


Sujet :

avec Java

  1. #1
    Membre averti
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Août 2011
    Messages
    756
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 30
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Août 2011
    Messages : 756
    Points : 376
    Points
    376
    Par défaut Test de chaînes
    Bonsoir à tous,

    petite question par rapport à une réponse de Joel dans un autre topic

    Il existe des fonctionnements internes à Java, qui permettent pourtant dans certains cas que 2 variables de type chaines de même valeur soit identiques (donc pour lesquelles le test par == est vrai)
    Quelqun aurait-il un exemple sous la main de l'un de ces cas ou l'on peut tester l'égalité de 2 chaines avec "==" au lieu de equals ?


    Merci à vous !

  2. #2
    Modérateur

    Profil pro
    Inscrit en
    Septembre 2004
    Messages
    12 559
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2004
    Messages : 12 559
    Points : 21 619
    Points
    21 619
    Par défaut
    Hello,

    On ne peut pas vraiment le faire, cette possible égalité n'est là que pour optimiser le stockage des String en mémoire.
    Elle ne sert pas à permettre d'utiliser == à la place de equals().

    Prenons un exemple :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    // définir des String
    String[] possibles = {"pair", "impair"};
     
    // remplir une liste avec
    List<String> suite = new ArrayList<>();
    for(int i = 0; i < 10; i++) {
      suite.add(possibles[i%2]);
    }
     
    // compter les "pair"
    int nbPair = 0;
    for(String s : suite) {
      if(s == "pair") {
        nbPair++;
      }
    }
    System.out.println("Nombre de pair: " + nbPair);
    la comparaison if(s == "pair") fonctionne comme attendu.
    C'est parce que les String de valeur pair ont toujours été construites avec le littéral "pair" qui apparaît comme ça dans le code Java. Il n'a pas été lu dans l'invite de commande, ou dans un fichier ou sur le réseau. Il n'a pas été construit à partir d'autres String. "pair" faisait partie du programme Java dès le départ. Et dans ce cas toute String qui représente ce littéral, sera toujours le même objet String, comparable avec lui-même avec ==

    Mais, ça ne sert à rien au programmeur. Il fallait utiliser un enum pour écrire ce programme, pas des String.
    Java fait ça pour éviter de créer en mémoire des millions d'objets String qui valent tous "pair" alors qu'un seul suffisait.

  3. #3
    Membre confirmé Avatar de Kazh Du
    Homme Profil pro
    Développeur Java
    Inscrit en
    Novembre 2011
    Messages
    152
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur Java
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Novembre 2011
    Messages : 152
    Points : 561
    Points
    561
    Par défaut
    "==" entre 2 objets va tester l'adresse mémoire. Dans certains cas, 2 chaines peuvent partager la même adresse mémoire car la JVM cherchera à optimiser l'adressage mémoire.

    Un petit exemple vaut mieux qu'un long discours :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
        final String stringA = "Une chaine";
        final String stringB = stringA;
        final String stringC = "Une chaine";
        String stringD;
        stringD = "Une";
        stringD += " ";
        stringD += "chaine";
     
        if (stringA == stringB)
        {
          System.out.println("stringA == stringB"); // vrai car il s'agit du même objet strictement
        }
     
        if (stringA == stringC)
        {
          System.out.println("stringA == stringC"); // vrai car la JVM à optimisé la mémoire
        }
     
        if (stringA == stringD)
        {
          System.out.println("stringA == stringD"); // faux car on a constitué la chaine élément par élément
        }
     
        if (stringA.equals(stringD))
        {
          System.out.println("stringA.equals(stringD)"); // pourtant A et D contiennent les mêmes données
        }
    Bref, il vaut mieux ne pas compter dessus et n'utiliser "==" que dans le cas de primitives.

  4. #4
    Modérateur
    Avatar de joel.drigo
    Homme Profil pro
    Ingénieur R&D - Développeur Java
    Inscrit en
    Septembre 2009
    Messages
    12 430
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Ingénieur R&D - Développeur Java
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2009
    Messages : 12 430
    Points : 29 131
    Points
    29 131
    Billets dans le blog
    2
    Par défaut
    A noter cet intéressant cas :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    	public static void main(String[] args) {
     
    		String shello = "Hello";
    		String she1 = "He";
    		final String she2 = "He";
    		final String shello1 = she1 + "llo";
    		final String shello2 = she2 + "llo";
     
    		System.out.println("\""+shello+"\"==\""+shello1+"\" vaut " + (shello==shello1)); // affiche "Hello"=="Hello" vaut false.
    		System.out.println("\""+shello+"\"==\""+shello2+"\" vaut " + (shello==shello2)); // affiche "Hello"=="Hello" vaut true !
     
    	}
    Une raison de plus, s'il en fallait, pour ne pas utiliser ==.

  5. #5
    Membre averti
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Août 2011
    Messages
    756
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 30
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Août 2011
    Messages : 756
    Points : 376
    Points
    376
    Par défaut
    Donc typiquement chaine1==chaine2

    ssi les deux chaînes sont des constantes déterminées dès le début.

  6. #6
    Expert éminent sénior
    Avatar de tchize_
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2007
    Messages
    25 482
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : Belgique

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2007
    Messages : 25 482
    Points : 48 807
    Points
    48 807
    Par défaut
    == fonctionne avec deux chaines dans deux conditions différentes:


    Si elles ont la même origine. Exemple:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    public static final String KEY1 = "key1";
    public static final String KEY2 = "key2";
    public static final String KEY3 = "key3";
     
    button.setAction(KEY1);
    button.addActionListener(
    ...
     
     if (event.getAction() == KEY2)
        ....

    Si elles sont passées par intern() (cas des chaines prédéfinies par exemple)

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    String s1 = new String({'a','b','c','d'}).intern();
    String s2 = new String({'a','b','c','d'}).intern();
    s1==s2 //true

Discussions similaires

  1. [SQL] Tests de chaînes de caractères
    Par sempire dans le forum Langage SQL
    Réponses: 3
    Dernier message: 14/10/2008, 23h04
  2. Réponses: 1
    Dernier message: 04/09/2007, 16h24
  3. Test sur une chaîne de caractères
    Par ThunderBolt_ dans le forum Général VBA
    Réponses: 4
    Dernier message: 27/06/2007, 06h37
  4. Test sur un ensemble de chaîne
    Par ftoutin dans le forum Delphi
    Réponses: 8
    Dernier message: 31/01/2007, 16h55
  5. Test d'une chaîne de caractères
    Par salty dans le forum Langage
    Réponses: 3
    Dernier message: 04/08/2006, 16h40

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo