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 :

Pourquoi la modif d'un int[] influence un autre int[]?


Sujet :

Langage Java

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre régulier
    Profil pro
    Inscrit en
    Novembre 2002
    Messages
    7
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Novembre 2002
    Messages : 7
    Par défaut Pourquoi la modif d'un int[] influence un autre int[]?
    Bonjour,

    J'ai un problème de compréhension, probablement de référent.

    Dans le programme suivant (fichier joint ou ci-dessous), je crée un tableau d'entier qui j'initialise {1,2,3,4,5}. Puis je créer une deuxième tableau d'entier qui devient égal au premier.

    1- Puis, en modifiant un élément du premier tableau, comment se fait-il que le deuxième en est également modifié?

    2- Quel est le mécanisme de base que je n'ai pas compris?

    3- Pourquoi en faisant la même chose avec des entiers, ça marche?

    Grand merci pour vos réponses.

    Le code :
    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
    public class Test {
     
    	static void affiche(int[] v){
    		  for (int i=0; i<v.length; i++){
    		    System.out.print(v[i]+" ");
    		}
    		System.out.println();
    	}
     
    	public static int[] clone(int[] v){
    		int[] res = new int[v.length];
    		for (int i = 0; i<v.length; i++){
    			res[i]=v[i];
    		}
    		return res;
    	}
     
    	public static void main(String[] args) {
     
    		int[] v1 = {1,2,3,4,5};
    		int[] v2 = new int[5];
    		int[] v3 = new int[5];
    		int[] v4 = new int[5];
     
    		// Je copie v1 dans les vecteurs v2, v3 et v4 de différentes manières.
    		v2 = v1;
    		for (int i=0; i<v1.length; i++){
    			v3[i] = v1[i];
    		}
    		v4 = clone(v1);
     
    		v1[1] = 8;
     
    		affiche(v1); // Affiche 1 8 3 4 5
    		affiche(v2); // Affiche 1 8 3 4 5
    		affiche(v3); // Affiche 1 2 3 4 5
    		affiche(v4); // Affiche 1 2 3 4 5
             }
    }
    Fichiers attachés Fichiers attachés

  2. #2
    Modérateur

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

    Informations forums :
    Inscription : Septembre 2004
    Messages : 12 582
    Par défaut
    v2 = v1; est une opération d'assignation, pas de copie.
    Cela fait simplement en sorte que la variable v2 désigne à présent le même tableau que la variable v1.

    Toutes autres méthodes s'occupent bien de créer un nouveau tableau avec new, puis avec une boucle, d'assigner à chaque case du nouveau tableau, la valeur correspondante du tableau v1. Ce qui signifie donc qu'on prend chaque valeur et qu'on la met ailleurs, ce qui réalise en effet une copie.
    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

  3. #3
    Membre régulier
    Profil pro
    Inscrit en
    Novembre 2002
    Messages
    7
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Novembre 2002
    Messages : 7
    Par défaut
    Merci pour cette réponse, qui me donne des pistes de réflexions, mais tout n'est pas encore clair. J'utilisais bien un new pour instancier(?) v2. Par exemple, je vois pas de grande différence entre ...

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    int[] v1 = {1,2,3,4,5};
    int[] v2 = {6,7,8,9,0};
    v2 = v1;
    affiche(v1); // Affiche 1 8 3 4 5
    affiche(v2); // Affiche 1 8 3 4 5
    ... et

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    int n1 = 2;
    int n2 = 3;
    n2 = n1;
    n1 = 99;
    System.out.println(n1); // Affiche 99
    System.out.println(n2); // Affiche 2 et non 99!
    Apparemment, le premier a fait une opération d'assignation, et l'autre une copie. Est-ce dû au fait que le premier est d'un type non-primitif et le deuxième primitif?

    Cordialement,

  4. #4
    Modérateur

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

    Informations forums :
    Inscription : Septembre 2004
    Messages : 12 582
    Par défaut
    Ben la différence c'est

    Tu as cette ligne dans ton deuxième exemple, mais il n'y a rien de ce genre dans le premier.

    Ajoute

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    v1 = new int[]{98, 99, 100};
    au même endroit, et tu obtiens le même résultat.

    Donc, effectivement, il n'y a pas de différence. Quand on oublie pas des lignes.

    J'utilisais bien un new pour instancier(?) v2
    Oui, tu as instancié un nouveau tableau pour v2, une fois. Et avec v2 = v1;, tu as immédiatement jeté ce nouveau tableau à la poubelle, et fait en sorte qu'à la place, v2 contienne le même tableau que v1.
    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

  5. #5
    Membre régulier
    Profil pro
    Inscrit en
    Novembre 2002
    Messages
    7
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Novembre 2002
    Messages : 7
    Par défaut
    Bonjour et merci pour la réponse! Mes idées sont bien plus claires maintenant.

    (Dans mon dernier poste, j'ai bêtement oublié la ligne de code v1[1] = 8, ce qui rend mon propos moins pertinent...)

    Cordialement,

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

Discussions similaires

  1. Réponses: 9
    Dernier message: 16/07/2009, 03h00
  2. Réponses: 3
    Dernier message: 04/03/2007, 09h34
  3. Réponses: 1
    Dernier message: 22/06/2006, 09h47
  4. Ajout & modif d'une table vers l'autre
    Par BOTIGUA dans le forum Access
    Réponses: 1
    Dernier message: 17/02/2006, 18h00

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