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

Langage Java Discussion :

Subtilités Type String


Sujet :

Langage Java

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre du Club
    Profil pro
    Étudiant
    Inscrit en
    Novembre 2008
    Messages
    6
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Novembre 2008
    Messages : 6
    Par défaut Subtilités Type String
    Bonjour, comment interpréter le résultat des 3 blocs qui suivent? merci beaucoup des éclaircissements...


    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
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    public class TestString {
        public static void main(String[] args){
            String ch1 = new String("bonjour");//ch1 et ch2 créés en utilisant new
                                                             (objets String?)
            String ch2 = new String("bonjour"); 
     
            /*BLOC1*/
            System.out.println("Test 1: comparaison(==) de 2 String créées AVEC  new");
            //résultat en comparant 2 String affectées en utilisants new
            if (ch1==ch2)
                System.out.println("Test 1=égal");
            else 
                System.out.println("Test 1=pas égal");
            //ici on a comparé la référence
     
            /*BLOC2*/
            String ch3="bonjour";//variables déclarées et affectées sans new (type primaire String?)
            String ch4="bonjour";  
     
            System.out.println("Test 2: comparaison(==) de 2 String créées SANS new");
     
            if (ch3==ch4)
                System.out.println("Test 2=égal");
            else
                System.out.println("Test 2=pas égal");
            //ici les  valeurs contenues ont été comparées
     
            /*BLOC3*/
            String ch5="bonjour";
            String ch6= "bon";
     
            ch6+="jour";//crée concaténation pour que la résultant donne "bonjour"
     
            System.out.println("Test 3: comparaison(==) de 2 variables définies sans new... dont l'une est le résultat d'une concaténation ");  
            if (ch5==ch6)
                System.out.println("Test 3=égal");
            else
                System.out.println("Test 3=pas égal");
     
     
           /***********Résultat affiché********************
           Test 1: comparaison(==) de 2 String créées AVEC new
           Test 1=pas égal
           Test 2: comparaison(==) de 2 String créées SANS new
           Test 2=égal
           Test 3: comparaison(==) de 2 variables définies sans new... dont l'une est le résultat d'une concaténation 
           Test 3=pas égal
        */
        }
    }

  2. #2
    Membre chevronné
    Profil pro
    Développeur Java
    Inscrit en
    Novembre 2007
    Messages
    301
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur Java

    Informations forums :
    Inscription : Novembre 2007
    Messages : 301
    Par défaut
    Il faut savoir que égal test si les références sont égales.

    Dans le premier, il y a création de deux objets distincts et qui ont donc deux références distinctes.

    Dans le deuxième cas, Java utilise son pool de constantes String. En effet, dans ce cas on parle de "litteral string". Dès lors, Java va vérifier que la String n'existe pas déjà dans son pool de constantes avant d'allouer un nouvel objet. Or ici, ch4 à une valeur qui existe déjà dans le pool et donc la même référence que ch3 lui sera retourné.

    Dans le troisième cas, les concaténations de chaîne effectuées au runtime crées de nouvelles chaînes et donc ont des références distinctes.
    Pour forcer l'égalité, il te suffirait de faire ch5==ch6.intern() qui est un appel explicite au pool.
    Ou bien faire en sorte que la concaténation s'effectue à la compilation, par exemple en ajoutant le mot clé final :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    String ch5 = "bonjour";
    final String ch6 = "bon";
    System.out.println(ch5 == (ch6 + "jour"));

  3. #3
    Modérateur
    Avatar de nouknouk
    Homme Profil pro
    Inscrit en
    Décembre 2006
    Messages
    1 655
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France

    Informations forums :
    Inscription : Décembre 2006
    Messages : 1 655
    Par défaut
    peut-être le plus important: quand on veut test l'égalité du contenu de deux strings, on utilise la fonction 'equals':

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    if (string1.equals(string2)) /*...*/

  4. #4
    Membre du Club
    Profil pro
    Étudiant
    Inscrit en
    Novembre 2008
    Messages
    6
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Novembre 2008
    Messages : 6
    Par défaut
    Merci DarkXan! c'est l'éclaircissement que je recherchais. Pour ce qui est de la méthode equals(), je la connaissais et comprends qu'elle sert à évaluer le contenu des variables plutôt que les références.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [CR] les champs de type string
    Par yvescollet dans le forum SAP Crystal Reports
    Réponses: 4
    Dernier message: 05/10/2004, 16h29
  2. Type String* en paramètre...
    Par Invité dans le forum MFC
    Réponses: 4
    Dernier message: 24/02/2004, 19h48
  3. Convertir une date en type string
    Par ziboux dans le forum SQL Procédural
    Réponses: 2
    Dernier message: 29/10/2003, 10h52
  4. [VB6] creation de variable de type string dynamiquement
    Par da40 dans le forum VB 6 et antérieur
    Réponses: 10
    Dernier message: 12/06/2003, 16h59
  5. Réponses: 2
    Dernier message: 05/06/2002, 12h29

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