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 :

instanciation avec ou sans new


Sujet :

avec Java

  1. #1
    Membre à l'essai
    Homme Profil pro
    Rédacteur technique
    Inscrit en
    Septembre 2016
    Messages
    11
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Vosges (Lorraine)

    Informations professionnelles :
    Activité : Rédacteur technique
    Secteur : Enseignement

    Informations forums :
    Inscription : Septembre 2016
    Messages : 11
    Points : 15
    Points
    15
    Par défaut instanciation avec ou sans new
    bonjour,
    pouvez-vous m'expliquer les différences entre ces écritures :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    String s1 = new String("developpez.com");
    String s2 = "developppez.com" ;
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    int[] tab1 = new int[]{1;2;3};
    int[] tab2 = {1;2;3};
    merci

  2. #2
    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
    Salut,

    Commençons par le cas du tableau de int :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    int[] tab1 = new int[]{1;2;3};
    int[] tab2 = {1;2;3};
    Tout d'abord la bonne syntaxe c'est (avec des virgules pour séparer les éléments du tableau)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    int[] tab1 = new int[]{1,2,3};
    int[] tab2 = {1,2,3};
    Les deux lignes font la même chose exactement : elles créent un tableau de int, dimensionné à 3 éléments, et prérempli. La seconde écriture est juste une simplification de la première pour rendre l'initialisation à la déclaration plus concise (elle n'est d'ailleurs utilisable que lors d'une déclaration).

    Dans le cas du String, ce n'est pas la même chose.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    String s1 = new String("developpez.com");
    String s2 = "developppez.com" ;
    La première ligne créé une nouvelle instance d'objet de type String, avec pour valeur "developpez.com".
    La seconde ligne affecte à s2 une valeur de chaîne créée dans un dictionnaire qui sera utilisé pour toute autre variable d'affectation identique.

    Pour mieux te rendre compte de la différence, essaye avec :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    String s1 = new String("developpez.com");
    String s2 = "developpez.com";
    String s3 = new String("developpez.com");
    String s4 = "developpez.com";
    Si tu exécutes les lignes suivantes avec ces variables

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    System.out.println("s1.equals(s2) : " + s1.equals(s2));
    System.out.println("s1.equals(s3) : " + s1.equals(s3));
    System.out.println("s1.equals(s4) : " + s1.equals(s4));
    System.out.println("s2.equals(s4) : " + s2.equals(s4));
    Tu obtiens :
    s1.equals(s2) : true
    s1.equals(s3) : true
    s1.equals(s4) : true
    s2.equals(s4) : true
    Normal, toutes ces chaînes sont bien égales.

    Maitenant, au lieu de tester l'égalité, testons l'identité (on teste l'égalité des références d'objet, donc si c'est la même instance ou pas) :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    System.out.println("s1==s2 : " + (s1==s2));
    System.out.println("s1==s3 : " + (s1==s3));
    System.out.println("s1==s4 : " + (s1==s4));
    System.out.println("s2==s4 : " + (s2==s4));
    On obtient :
    s1==s2 : false
    s1==s3 : false
    s1==s4 : false
    s2==s4 : true
    Les trois premiers résultats indiquent que s1, s2 et s3 référencent bien 3 instances différentes. Mais s4 référence la même instance que s2.
    D'ailleurs, la plupart du temps, comme on ne sait pas comment a été instanciée une chaîne (comme on utilise des méthodes écrites par d'autres), on utilisera toujours equals() pour tester l'égalité de 2 variables de type String (même si le == pourrait marcher dans beaucoup de cas).

    Note qu'avec
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    String s1 = "developpez" + ".com";
    String s2 = "developpez.com";
    String s3 = "developpez";
    String s4 = s3 + ".com";
    String s5 = s3 + ".com";
     
    System.out.println("s1==s2 : " + (s1==s2));
    System.out.println("s1==s4 : " + (s1==s4));
    System.out.println("s2==s4 : " + (s2==s4));
    System.out.println("s4==s5 : " + (s4==s5));
    On obtiendra :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    s1==s2 : true
    s1==s4 : false
    s2==s4 : false
    s4==s5 : false
    En effet, le compilateur remplace la première ligne par un équivalent de la seconde, ce qui fait que les deux lignes font la même chose de la même façon et reviennent au même.
    Alors que dans le cas de s4 (ou s5), on passe par un StringBuilder pour faire la concaténation, et la valeur affectée à la variable est créée par un new String() : ce qui explique que les instances soient différentes.
    L'expression "ça marche pas" ne veut rien dire. Indiquez l'erreur, et/ou les comportements attendus et obtenus, et donnez un Exemple Complet Minimal qui permet de reproduire le problème.
    La plupart des réponses à vos questions sont déjà dans les FAQs ou les Tutoriels, ou peut-être dans une autre discussion : utilisez la recherche interne.
    Des questions sur Java : consultez le Forum Java. Des questions sur l'EDI Eclipse ou la plateforme Eclipse RCP : consultez le Forum Eclipse.
    Une question correctement posée et rédigée et vous aurez plus de chances de réponses adaptées et rapides.
    N'oubliez pas de mettre vos extraits de code entre balises CODE (Voir Mode d'emploi de l'éditeur de messages).
    Nouveau sur le forum ? Consultez Les Règles du Club.

Discussions similaires

  1. Initialiser IState avec ou sans un new
    Par JeanNoel53 dans le forum Débuter avec Java
    Réponses: 5
    Dernier message: 07/07/2015, 00h54
  2. Création délégué avec ou sans new
    Par zworg dans le forum VB.NET
    Réponses: 3
    Dernier message: 07/03/2012, 16h59
  3. avec ou sans new
    Par menthol34 dans le forum Langage
    Réponses: 2
    Dernier message: 16/05/2009, 14h34
  4. L'operateur new, avec ou sans ?
    Par zi_omnislasher dans le forum C++
    Réponses: 11
    Dernier message: 28/09/2007, 10h21
  5. [C#] [EXCEL] Travailler avec EXCEL sans ouvrir le logiciel
    Par Fabsou dans le forum Windows Forms
    Réponses: 3
    Dernier message: 16/07/2004, 10h29

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