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 :

Question de mémoire


Sujet :

Langage Java

  1. #1
    Membre confirmé
    Profil pro
    Inscrit en
    Novembre 2011
    Messages
    56
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2011
    Messages : 56
    Par défaut Question de mémoire
    Petite question d'algo ou de gestion de la mémoire en Java :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     
    Vector<Vector<Object>> DataVec ;
    Vector<Object> ColVec;
    Vecor<Object> TmpVec;
     
    for (int i=0; i<10; i++){
    			int j = 0;
    			while (j < 10){
    				ColVec.addElement ("pipou");
    				j++;
    			}
    			DataVec.addElement(ColVec);
    			ColVec.clear();
    		}
    C'est du vrai code mais que j'ai simplifié du coup il n'a aucun intérêt tel quel mais c'est l'algo qui compte. En faisant ça je me suis rendu compte que :

    DataVec.elementAt(0).size()

    renvoyait 0. Autrement dit le ColVec.clear() vide aussi le vector qui a déjà été ajouté au vector DataVec. Je trouve ça bizarre car je pensais que addElement() réservait un nouvel espace mémoire dans lequel on clone() le ColVec et qu'on le rajoutait à DataVec, une vraie copie en somme. Du coup j'ai du feinter en faisant moi même le clone () et en l'écrasant à chaque fois avant de l'ajouter :

    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
     
    Vector<Vector<Object>> DataVec ;
    Vector<Object> ColVec;
    Vecor<Object> TmpVec;
     
    for (int i=0; i<10; i++){
    			int j = 0;
    			while (j < 10){
    				ColVec.addElement ("pipou");
    				j++;
    			}
    			TmpVec = (Vector<Object>)ColVec.clone ();
    			DataVec.addElement(TmpVec);
    			ColVec.clear();
    		}
    Trouvez vous ça normal? M'y suis-je mal pris? Comment feriez vous? Car la méthode du clone() me parait quand même pas très propre (précision: pas le droit de tricher en utilisant des tableaux ^^)

  2. #2
    Expert éminent
    Avatar de adiGuba
    Homme Profil pro
    Développeur Java/Web
    Inscrit en
    Avril 2002
    Messages
    13 938
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Java/Web
    Secteur : Transports

    Informations forums :
    Inscription : Avril 2002
    Messages : 13 938
    Billets dans le blog
    1
    Par défaut
    Salut,

    Citation Envoyé par Ayok13 Voir le message
    Je trouve ça bizarre car je pensais que addElement() réservait un nouvel espace mémoire dans lequel on clone() le ColVec et qu'on le rajoutait à DataVec, une vraie copie en somme.
    Non : il n'y a pas de copie implicite en Java...


    Citation Envoyé par Ayok13 Voir le message
    Trouvez vous ça normal? M'y suis-je mal pris? Comment feriez vous? Car la méthode du clone() me parait quand même pas très propre (précision: pas le droit de tricher en utilisant des tableaux ^^)
    Oui c'est tout à fait normal. Si tu as besoin de plusieurs objets différents il suffit de les créer lorsque tu en as besoin (plutôt que de les cloner).


    Au passage :
    • Essayes de respecter les conventions de nommages
    • Vector est déconseillé. Sauf besoin spécifique tu peux lui préférer les ArrayList
    • Pourquoi utiliser un for et un while pour le même genre de boucle ? Autant utiliser tout le temps la même chose ce sera plus lisible...



    a++

  3. #3
    Membre confirmé
    Profil pro
    Inscrit en
    Novembre 2011
    Messages
    56
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2011
    Messages : 56
    Par défaut
    Merci de la réponse.
    Quand tu dis "Si tu as besoin de plusieurs objets différents il suffit de les créer lorsque tu en as besoin (plutôt que de les cloner)". Dans mon cas ça voudrait dire faire un "new" à chaque début de boucle? A la base j'évitais de faire ça pour ne pas instancier un nouvel objet à chaque fois pour la mémoire.... mais remarque maintenant que j'y pense y'a le garbage collector qui se débrouille....

    Conventions de nommage? comme les variables qui doivent commencer par une minuscule par exemple? En tout cas je sais que c'est un peu erratique dans mon prog, par exemple pour une requête en BD au lieu de faire "SELECT sujet, type FROM..." j'ai fait tout l'inverse "select SUJET, TYPE from..." lol, mais bon au moins j'essaie de rester cohérent à l'intérieur de mon code même si ce ne sera pas forcément lisible de l'extérieur ^^ mais c'est vrai qu'il faudrait que je m'y mette pour que ce soit plus clair.

    Oui pour le while en effet, c'est juste qu'à la base je n'avais besoin que du for, le while est venu après, mais je dois changer ça c'est clair.

    Et encore oui pour le Vector, en fait je viens de découvrir le fait de décrire son propre AbstractTableModel, dans un tuto on donnait le choix entre Vector et ArrayList, connaissant mieux le premier je me suis porté sur lui, mais le conseil est bien retenu pour la prochaine fois. Mais, au fait, pourquoi est ce déconseillé? Mémoire? Portabilité? Performance?

    PS: je viens de virer le clone().... et ça m'a réglé un bug de mon algo cool

  4. #4
    Expert éminent
    Avatar de adiGuba
    Homme Profil pro
    Développeur Java/Web
    Inscrit en
    Avril 2002
    Messages
    13 938
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Java/Web
    Secteur : Transports

    Informations forums :
    Inscription : Avril 2002
    Messages : 13 938
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par Ayok13 Voir le message
    Merci de la réponse.
    Quand tu dis "Si tu as besoin de plusieurs objets différents il suffit de les créer lorsque tu en as besoin (plutôt que de les cloner)". Dans mon cas ça voudrait dire faire un "new" à chaque début de boucle? A la base j'évitais de faire ça pour ne pas instancier un nouvel objet à chaque fois pour la mémoire.... mais remarque maintenant que j'y pense y'a le garbage collector qui se débrouille....
    Ben... Si tu as besoin d'un nouvel objet crée le. Si tu dois avoir deux listes distinctes ce doit être lisible explicitement dans le code.

    Cela ne sera pas fait de manière implicite par le langage...


    Citation Envoyé par Ayok13 Voir le message
    Conventions de nommage? comme les variables qui doivent commencer par une minuscule par exemple?
    Oui. Ca permet surtout de mieux se faire comprendre par d'autre programmeurs...

    Pour faire cela rapidement : nomDeMethode(), nomDeVariable, NomDeClasse, NOM_DE_CONSTANTE.

    Parce que perso quand je lis ceci :
    Je pense que clear() est une méthode static de la classe ColVec



    Citation Envoyé par Ayok13 Voir le message
    Mais, au fait, pourquoi est ce déconseillé? Mémoire? Portabilité? Performance?
    Pour des raisons de syntaxe (et un peu performance).

    Vector est une vieille classe qui date de Java 1.0. Depuis Java 1.2 on dispose d'une vrai API de Collections plus complète. Vector a été modifié pour bénéficier de la nouvelle API, mais du coup elle dispose de plein de doublons !

    Ainsi Vector possède 50 méthodes contre 35 pour ArrayList... mais les deux disposent des mêmes fonctionnalités !!!


    Enfin Vector est toujours synchronisé, ce qui est couteux et inutile si on ne le manipule pas depuis plusieurs threads...


    a++

  5. #5
    Membre confirmé
    Profil pro
    Inscrit en
    Novembre 2011
    Messages
    56
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2011
    Messages : 56
    Par défaut
    Merci de toutes ces précisions.
    Effectivement je ne connaissais pas le contexte historique de Vector. Finalement j'ai pas fait mon flemmard ça y est j'ai modifié le prog en conséquence avec des ArrayList

    En fait je voulais absolument passer par un objet intermédiaire, alors que je viens de m'apercevoir que ce n'était pas utile, d'où le fait que le code était bizarre ^^ Pas besoin de dataVec, j'insère directement la ligne (ArrayList) dans la JTable (à la base je voulais créer directement toute la JTable à partir d'un List<List<Object>>....), du coup ça devient plus claire et compréhensible.

    Ok pour les conventions, bon je peux changer les noms de fonctions car je n'en ai pas beaucoup, par contre pour les variables je vais laisser, je dois en avoir une centaine sans compter toutes leurs utilisations, là je fais mon flemmard lol, ça sera pour le prochain prog je vérifierai tout bien correctement :p

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

Discussions similaires

  1. Question Allocation Mémoire Conditionnelle
    Par JasBeckC dans le forum Débuter
    Réponses: 12
    Dernier message: 27/10/2014, 20h56
  2. Question sur firefox/mémoire
    Par Nemesys dans le forum Windows XP
    Réponses: 3
    Dernier message: 21/08/2006, 10h23
  3. Recoder malloc -> Questions sur la mémoire
    Par Trunks dans le forum C
    Réponses: 3
    Dernier message: 15/03/2006, 18h11
  4. [Hardware] questions sur la mémoire virtuelle
    Par Irae dans le forum Composants
    Réponses: 22
    Dernier message: 04/10/2005, 12h41
  5. Quelques questions sur la mémoire
    Par Gruik dans le forum C
    Réponses: 6
    Dernier message: 17/11/2004, 14h38

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