Forum |  HardWare.fr | News | Articles | PC | S'identifier | S'inscrire | Shop Recherche
2319 connectés 

  FORUM HardWare.fr
  Programmation
  Java

  [Java] Integer dans un Vector: utiliser valueOf() ou new ?

 


 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

[Java] Integer dans un Vector: utiliser valueOf() ou new ?

n°1283480
trevor
laissez la vie vous étonner...
Posté le 14-01-2006 à 03:50:40  profilanswer
 

'lut
 
juste une question d'optimisation et de propreté du code (car les 2 marchent), mais entre:

Code :
  1. Vector aa;
  2. ...
  3. aa.add(new Integer("0" ));


et

Code :
  1. Vector aa;
  2. ...
  3. aa.add(Integer.valueOf("0" ));


 
qu'est-ce qui est le mieux d'après vous ?
 
d'après la javadoc:

Citation :

static Integer valueOf(String s)  
          Returns a new Integer object initialized to the value of the specified String.


 
donc je dirais que c'est strictement la même chose, mais il y a peutetre des choses que je ne maitrise pas totalement.
 
merci d'avance


---------------
TReVoR - http://dev.arqendra.net - http://info.arqendra.net
mood
Publicité
Posté le 14-01-2006 à 03:50:40  profilanswer
 

n°1283481
nraynaud
lol
Posté le 14-01-2006 à 04:08:50  profilanswer
 

je te conseille ValueOf(), qui ne construit pas forcément d'objet. s'il veut, il peut réutiliser des objets dans ton dos (mais je ne coirs pas que ce soit le cas).
 
pour la classe String, c'est plus stratégique, car en utilisant String.valueOf(variable) au lieu de variable.toString(), tu es sûr de ne jamais avoir une NullPointerException si variable est null.

n°1283519
trevor
laissez la vie vous étonner...
Posté le 14-01-2006 à 10:19:43  profilanswer
 

ok. merci pour le conseil. je pensai en effet à une optimisation du style "pas de construction d'objet". quant à la même question appliquée à String, et bien c'est tjs bon à savoir :)


---------------
TReVoR - http://dev.arqendra.net - http://info.arqendra.net
n°1283852
nraynaud
lol
Posté le 15-01-2006 à 09:58:30  profilanswer
 

heu mais je viens de capter, pourquoi tu n'utilise pas
 
new Integer(0);
 
sans passer par une string ?

n°1283870
grimgroth
Posté le 15-01-2006 à 11:38:52  profilanswer
 

Et pourquoi tu n'utilises pas l'autoboxing ?  

Code :
  1. Vector v = new Vector();
  2. v.add(0);


C'est utilisable depuis la version Tiger (5.0) de java. Donc attention si tu utilises une version antérieure.

n°1283886
trevor
laissez la vie vous étonner...
Posté le 15-01-2006 à 12:37:00  profilanswer
 

nraynaud a écrit :

heu mais je viens de capter, pourquoi tu n'utilise pas
 
new Integer(0);
 
sans passer par une string ?


 
le code que j'ai passé est un exemple, je me suis simplement posé cette question au moment où je parcourais les méthodes de Integer
sinon, en effet, new Integer(0) fonctionne aussi. quelle différence fais-tu avec new Integer("0" ) ? (là encore c'est une question d'optimisation, pour "comprendre" )
 
quant à l'autoboxing, sans façon. je travaille encore avec le jdk 1.3.1. je vais peutetre passer au 1.4, et encore c'est simplement parceque les regex m'intéressent...


---------------
TReVoR - http://dev.arqendra.net - http://info.arqendra.net
n°1283901
amnesiks
Posté le 15-01-2006 à 12:59:02  profilanswer
 

Dans java il y a deux manière de représenter les entiers, une avec le type primitif int et une avec l'objet Integer.
 
L'objet Integer est en fait un int avec une envellope externe (wrapper), donc le constructeur le plus rapide est "new Integer(138)", si tu met new Integer("138" ), le systeme est obligé d'analyser la chaine de caractère "138", d'en extraire l'entier 138 pour ensuite le mettre dans l'objet Integer, pareil pour Integer.valueof, tandis que  "new Integer(138)" n'implique aucune conversion de type (138 est deja un int), il peut construire l'objet Integer directement.  
 
Si tu tapes le code de grimgroth tu verras qu'il y a des erreurs, en effet, depuis java 5.0 il faut dire au systeme si on construit un vector de string, ou un vector d'entier etc...
 
Donc moi j'écrirais plutot:
 

Code :
  1. Vector<Integer> v = new Vector<Integer>();
  2. v.add(new Integer(138));


 
PS: J'avais pas vu que t'étais encore à java 1.4, oublie cette histoire de <>.

Message cité 1 fois
Message édité par amnesiks le 15-01-2006 à 13:00:23
n°1283910
trevor
laissez la vie vous étonner...
Posté le 15-01-2006 à 13:10:11  profilanswer
 

amnesiks a écrit :

L'objet Integer est en fait un int avec une envellope externe (wrapper), donc le constructeur le plus rapide est "new Integer(138)", si tu met new Integer("138" ), le systeme est obligé d'analyser la chaine de caractère "138", d'en extraire l'entier 138 pour ensuite le mettre dans l'objet Integer, pareil pour Integer.valueof, tandis que  "new Integer(138)" n'implique aucune conversion de type (138 est deja un int), il peut construire l'objet Integer directement.


 
c'est bien ce que je pensais, mais je voulais etre sur. même si les 2 solutions marchent, j'ai besoin de ce genre d'optimisation, deja pour m'améliorer globalement, et puis pour améliorer mon code, car j'utilise ce genre de choses dans un algo type backpack, dont le temps de traitement est gravement exponentiel: de 1-2 secondes pour 15 entrées, à au moins 20 secondes pour une 30aine... sachant que mon programme est prévu pour tourner avec plus d'une centaine d'entrées - plus de 800 dans mon cas - ca donne une idée du temps de traitement globale :\. donc je cherche à optimiser au mieux


---------------
TReVoR - http://dev.arqendra.net - http://info.arqendra.net
n°1283913
nraynaud
lol
Posté le 15-01-2006 à 13:15:09  profilanswer
 

on peu voir le code ?  
par ce que je suis pas sûr que ce soit là-dessus que tu vas gagner ...

n°1283928
sircam
I Like Trains
Posté le 15-01-2006 à 13:47:56  profilanswer
 

Faut se méfier des optimisations "qui semblent logiques"...


---------------
Now Playing: {SYNTAX ERROR AT LINE 1210}
mood
Publicité
Posté le 15-01-2006 à 13:47:56  profilanswer
 

n°1283933
trevor
laissez la vie vous étonner...
Posté le 15-01-2006 à 14:03:15  profilanswer
 

voilà... je demanderai votre indulgence si des abberrations vous sautent aux yeux, ce code est en cours de développement - mais le code est tout de même fctnnel ;):

Code :
  1. public class OptimisationTaille implements Runnable {
  2.   ...
  3.   private Hashtable tailleReps;
  4.   private Hashtable posReps;
  5.   private Hashtable cdsMp3;
  6.   private int[] meilleurCd, cd;
  7.   private long pertePlace;
  8.   int numCd;
  9.   ...
  10.   void remplissageListe() {
  11.     ...
  12.     StringBuffer str;
  13.     this.tailleReps = new Hashtable(0);
  14.     this.posReps = new Hashtable(0);
  15.     this.cdsMp3 = new Hashtable(0);
  16.     //* récupérer la liste des entrées
  17.     requete = "SELECT * FROM " + this.params.bddNomTableMp3Gst;
  18.     this.st = this.bdd.getFluxRequete();
  19.     try {
  20.       rs = st.executeQuery(requete); // exécution de la requête
  21.       while (rs.next()) { // tant que le résultat de la requête est non-vide
  22.         if (rs.getInt(3) == 0) {
  23.           this.tailleReps.put(String.valueOf(rs.getInt(1)), Integer.valueOf(rs.getString(2)));
  24.           this.posReps.put(String.valueOf(rs.getInt(1)), Integer.valueOf("0" ));
  25.         }
  26.       }
  27.     }
  28.     catch (SQLException sqle) {System.out.println("Erreur: accès bdd" );}
  29.     ...
  30.     this.cd = new int[this.tailleReps.size()];
  31.     this.meilleurCd = new int[this.tailleReps.size()];
  32.     this.numCd = 0;
  33.     do {
  34.       this.numCd++;
  35.       this.cdsMp3.put(String.valueOf(this.numCd), new Vector(0));
  36.       this.pertePlace = Long.parseLong(this.params.optTailleMedia);
  37.       this.backPack(0, Long.parseLong(this.params.optTailleMedia));
  38.       str.delete(0, str.length());
  39.       str.append("CD " ).append(this.numCd).append(":" );
  40.       for (int j=0 ; j < this.tailleReps.size() ; j++)
  41.         if ((this.meilleurCd[j] == this.numCd) && (((Integer)this.posReps.get(String.valueOf(j))).intValue() == 0)) {
  42.           str.append(" " ).append(j);
  43.           this.posReps.put(String.valueOf(j), new Integer(this.numCd));
  44.           ((Vector)this.cdsMp3.get(String.valueOf(this.numCd))).add(new Integer(j));
  45.         }
  46.       str.append(" | " ).append(this.pertePlace);
  47.       System.out.println(str.toString());
  48.     }
  49.     while (this.posReps.contains(Integer.valueOf("0" )));
  50.   }
  51.   void backPack(int ind, long placeDispo) {
  52.     if (ind >= this.tailleReps.size()) { // si on est arrivé au bout de la liste
  53.       if (placeDispo < this.pertePlace) { // si on a trouvé une meilleure combinaison (moins de perte de place)
  54.         //* sauvegarde de la solution
  55.         for (int j=0 ; j < this.tailleReps.size() ; j++)
  56.           if ((this.meilleurCd[j] == 0) || (this.meilleurCd[j] == this.numCd)) // ne sauvegarder que les répertoires "libres"
  57.             this.meilleurCd[j] = this.cd[j];
  58.         this.pertePlace = placeDispo; // mettre à jour le résultat de cette combinaison (cd)
  59.       }
  60.     }
  61.     else {
  62.       if ( ( ((Integer)this.tailleReps.get(String.valueOf(ind))).intValue() < placeDispo)  && ((this.meilleurCd[ind] == 0) || (this.meilleurCd[ind] == this.numCd)) ) { // si le répertoire rentre dans l'espace disponible et qu'il est "libre"
  63.         this.cd[ind] = this.numCd; // inclure le répertoire dans cette combinaison (cd)
  64.         this.backPack(ind + 1, placeDispo - ((Integer)this.tailleReps.get(String.valueOf(ind))).intValue()); // passer au répertoire suivant
  65.       }
  66.       this.cd[ind] = 0; // exclure le répertoire de cette combinaison (cd)
  67.       this.backPack(ind + 1, placeDispo); // passer au répertoire suivant
  68.     }
  69.   }
  70. }


 
détails:
- l'idée est d'appliquer l'algo backpack plusieurs fois sur une liste d'éléments (tailleReps) afin de déterminer plusieurs sac-à-dos (en l'occurrence plusieurs cds de mp3)
- l'algo backpack a été implémenté en utilisant une fonction récursive (basé sur l'algo donné ICI)
- ces différents sac-à-dos trouvés sont stockés à la fois dans meilleurCd (pour le traitement récursif de l'algo backpack), dans posReps (pour la sauvegarde de la bonne solution - je pense pouvoir me passer de cet attribut, mais pour le moment il est là), et au final dans cdsMp3 ("inverse" de posReps: à chaque cd est associé l'Id des répertoires qui le constituent)
- les répertoires (enfin leurs capacités) sont issus d'une bdd, où sont associés un Id (col 1) et la taille en octets (col 2)
- la taille du média spécifiée par l'utilisateur est récupérée d'un ensemble de paramètres stockés dans une classe dont l'instance utilisée ici est params
 
nda: il s'agit de mp3 créés à partir de ma discothèque personnelle, le but étant de créer des cds spécifiquement pour ma discothèque de voiture


Message édité par trevor le 15-01-2006 à 14:12:57

---------------
TReVoR - http://dev.arqendra.net - http://info.arqendra.net
n°1283939
nraynaud
lol
Posté le 15-01-2006 à 14:09:44  profilanswer
 

j'ai pas encore lu mais l'idée d'utiliser cet algo pour ç aest intéressante. [:bien]
 
par contre tes perfs sont innaceptables.

n°1283945
nraynaud
lol
Posté le 15-01-2006 à 14:15:56  profilanswer
 

http://www.enseignement.polytechni [...] e.html#310
tu as regardé du côté de ça ? peut-être que ça marche aussi avec des grands entiers (taille des répertoires en octets).

n°1283954
trevor
laissez la vie vous étonner...
Posté le 15-01-2006 à 14:25:40  profilanswer
 

bah j'ai donné le code parce qu'on me l'a proposé. je peux très bien comprendre qu'on ait ni le temps ni l'envie de se plonger le nez dedans ;) - et en + j'ai quand même essayé de garder uniquement les choses nécessaires... :)
 
je viens de refaire plusieurs tests (au moins 2x pour chaque) montre-en-main:
- 53s pour une liste de 29 reps
- 11s pour 25 reps
- 2-3s pour 20 reps
 
:\


---------------
TReVoR - http://dev.arqendra.net - http://info.arqendra.net
n°1283960
trevor
laissez la vie vous étonner...
Posté le 15-01-2006 à 14:32:46  profilanswer
 

nraynaud a écrit :

http://www.enseignement.polytechni [...] e.html#310
tu as regardé du côté de ça ? peut-être que ça marche aussi avec des grands entiers (taille des répertoires en octets).


 
non pas encore. je cherchais justement un algo type backpack pour les entiers, car j'ai lu, à la fois sur ce site, et ailleurs, que ce pb est non-polynomial dans le cas où la capacité est réelle. or, dans mon cas, en effet elle est entière.
j'ai cherché un peu - certainement mal - mais n'ai pas trouvé d'éléments de solutions - ou d'éléments de solutions que je comprenne en tout cas ;)
 
en revanche, sur le lien que tu donnes, il n'y a qu'une ligne, c'est normal ? je n'ai pas retrouvé cette ligne sur le site. de quel page est extraite cette info stp ?
 
(merci de m'aider au fait ;))


---------------
TReVoR - http://dev.arqendra.net - http://info.arqendra.net
n°1283964
nraynaud
lol
Posté le 15-01-2006 à 14:39:35  profilanswer
 

sur la page que tu as donnévers le milieu.

n°1283973
trevor
laissez la vie vous étonner...
Posté le 15-01-2006 à 14:48:11  profilanswer
 

nraynaud a écrit :

sur la page que tu as donnévers le milieu.


 
ah oui, chez moi (opera) l'image du lien n'est pas affiché, je croyais que c'était juste une image sans lien. voilà pourquoi je ne l'avais pas lu
ca confirme donc ce que j'avais cru comprendre. je vais donc me pencher sur cette programmation dynamique ;)


---------------
TReVoR - http://dev.arqendra.net - http://info.arqendra.net

Aller à :
Ajouter une réponse
  FORUM HardWare.fr
  Programmation
  Java

  [Java] Integer dans un Vector: utiliser valueOf() ou new ?

 

Sujets relatifs
[Java] Process marche sous windows, pas sous linuxJava: Probleme de Cast
[Java 1.5] Process : afficher le flux de sortie[Java] Extraire informations d'un chemin
Quelle est l'interet d'étudier JAVA ou C++ ???Application JAVA retourne une FATAL EXCEPTION
Comment exécuter une commande DOS à partir d'un code JAVAJava, Corba et "callback"
[eclipse]Perte de code source java peut'on le retrouver ?eclipse makefile java
Plus de sujets relatifs à : [Java] Integer dans un Vector: utiliser valueOf() ou new ?


Copyright © 1997-2022 Hardware.fr SARL (Signaler un contenu illicite / Données personnelles) / Groupe LDLC / Shop HFR