Partage
  • Partager sur Facebook
  • Partager sur Twitter

Question sur valeur d'integer

Sujet résolu
    1 mai 2012 à 4:00:50

    Si dans mon programme je declare:
    Integer first = new Integer (42);
    Integer second = 42;


    first et second valent bien 42 ?!

    Si ensuite je declare:
    if(first==second)
    System.out.println("first and second are equal");
    else
    System.out.println("first and second are NOT equal");


    pourquoi c'est le message "first and second are NOT equal" qui s'affiche?
    • Partager sur Facebook
    • Partager sur Twitter
      1 mai 2012 à 4:23:20

      Salut
      Tu ne compares pas les valeurs, mais les objets avec toutes ses valeurs et pointeurs qui sont forcément différents.

      C'est la même chose que les Strings.
      Il faut utiliser .
      if (first.equals(second)){
      
      // ton code
      
      }
      


      Java, contrairement au C++, a très peu de surcharges d'opérateurs (je pense même que seul "+" est surchargé, mais je n'en suis pas sûr).
      • Partager sur Facebook
      • Partager sur Twitter
        1 mai 2012 à 8:35:00

        Plop,

        Comme le dit philippe83, tu compares des références sur des objets.

        Pour faire simple :
        • == : Compare des références ou les valeurs des types primitifs.
        • boolean equals(Object obj) : Compare la valeur de deux objets tels que le définit la méthode equals de l'objet.

        Par défaut, la classe Integer compare les deux int qu'elle contient.
        • Partager sur Facebook
        • Partager sur Twitter
          1 mai 2012 à 18:30:56

          donc si je fais
          first = second ou second = first
          je copie quoi? une reference ou une valeur?
          • Partager sur Facebook
          • Partager sur Twitter
            1 mai 2012 à 18:34:37

            Plop,

            Ca dépend.

            Si c'est un type primitif, tu copies la valeur.
            Si c'est un objet, tu copies la références.
            • Partager sur Facebook
            • Partager sur Twitter
              1 mai 2012 à 18:40:21

              Salut,

              Je m'étais déjà posé la question, j'avais été surpris.

              Integer first = 42;
              Integer second = first;
                      
              first = 54;
              System.out.println(second);
              // ==> 42
              


              Comme on copie la référence, l'affichage ne devrait-il pas être 54 ?

              Dans tous les cas c'est comme si on copiait la valeur ?
              • Partager sur Facebook
              • Partager sur Twitter
              Anonyme
                1 mai 2012 à 18:44:28

                les wrapper(tout comme les String) sont immutables et donc
                Integer i = 5; ref vers emplacement mémoire X
                i = 3; nouvelle ref vers emplacement mémoire Y
                • Partager sur Facebook
                • Partager sur Twitter
                  1 mai 2012 à 18:56:19

                  Citation : shakhal

                  les wrapper(tout comme les String) sont immutables et donc
                  Integer i = 5; ref vers emplacement mémoire X
                  i = 3; nouvelle ref vers emplacement mémoire Y


                  Précisions qu'en plus que pour des raisons de performances, certaines valeurs sont cachées (si utilisées de la bonne manière).
                  Les specs de Java 7 imposent par exemple, un cache de toutes les valeurs de -128 à 127 inclus dans la classe Integer.

                  Donc on a les règles suivantes :

                  Integer a = new Integer(5); // Toujours un nouvel objet, ref vers un emplacement mémoire A
                  Integer b = new Integer(5); // Toujours un nouvel objet, ref vers un emplacement mémoire B
                  // mais :
                  Integer x = Integer.valueOf(5); // Cache : ref vers un emplacement mémoire X
                  Integer y = Integer.valueOf(5); // Cache : ref vers le même emplacement mémoire X
                  // tandis que :
                  Integer i = Integer.valueOf(500); // Pas de cache : ref vers un emplacement mémoire I
                  Integer j = Integer.valueOf(500); // Pas de cache : ref vers un nouvel emplacement mémoire J
                  

                  Je ne sais pas ce qu'utilise l'autoboxing tiens, il faudrait vérifier.

                  Cela dit, la vraie réponse à ta question, c'est que tu ne dois jamais faire new Integer(42) dans ton code.
                  • Partager sur Facebook
                  • Partager sur Twitter

                  Question sur valeur d'integer

                  × Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
                  × Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.
                  • Editeur
                  • Markdown