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 :

Compréhension d'un code


Sujet :

avec Java

  1. #21
    Modérateur
    Avatar de Alkhan
    Homme Profil pro
    ingénieur full stack
    Inscrit en
    Octobre 2006
    Messages
    1 232
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : ingénieur full stack

    Informations forums :
    Inscription : Octobre 2006
    Messages : 1 232
    Par défaut
    Citation Envoyé par EyZox Voir le message
    Il me semble qu'il y a un pool de Integer, un pool de String etc ... donc les objets ne sont pas forcément ré-instancié, non ?
    Donc si "c" et "c" représente le même String en pool, == fonctionne puisque même référence mais on ne maitrise pas le pool.
    Pas vraiment en fait !
    Au chargement des classes s'il y a deux variables avec la valeur "c" alors les variables auront la même référence ni plus ni moins !
    C'est une optimisation pour pas encombrer la mémoire !
    Tout cela est possible uniquement par ce que les String sont immutable.

    Citation Envoyé par EyZox Voir le message
    Je vais te répondre exactement l'inverse, si on lui que == ne marche jamais sur les String : "un débutant qui lit ça ne comprendra pas pourquoi ce qu'il écrit fonctionne !"
    Ou as tu lu que j'avais dis que le "==" ne marchait pas sur les String ?
    Ce que j'ai dit c'est que le "==" compare les références (dans le cadre des objets), pas les valeurs !

    Vu que tu ne semble pas le comprendre, je vais te donner un exemple qui va te montrer la différence :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    String v1 = "C";
    String v2 = "C";
    String v3 = new String("C"); // créé une nouvelle référence contenant la valeur "C"
     
    System.out.println("v1 == v2 --> " + (v1 == v2)); // true
    System.out.println("v1 == v3 --> " + (v1 == v3)); // false
    Citation Envoyé par EyZox Voir le message
    Un débutant n'a pas besoin de comprendre pourquoi, il a juste besoin de le savoir.
    Tu vois pourquoi il faut comprendre !
    Il n'y a pas de problème, il n'y a que des solutions.
    Cependant, comme le disaient les shadoks, s'il n'y a pas de solution, c'est qu'il n'y a pas de problème.
    Si toutefois le problème persiste, la seule solution restante est de changer le périphérique qui se trouve entre la chaise et l'écran

    Mes Articles : Mon premier article est sur le language D
    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

  2. #22
    Invité
    Invité(e)
    Par défaut
    Oui j'ai bien compris que == compare les références des objets ^^ Je n'ai jamais dis l'inverse.
    Ça fait 4 ans que je fais du Java, pas besoin de m'expliquer ça x)
    Ce que je ne savais pas, c'est que le pool était construit uniquement à la compilation.
    Du coups effectivement, ce que j'ai dis est faux, dsl ^^ Ce ne serais pas hasardeux.

  3. #23
    Expert éminent
    Avatar de tchize_
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2007
    Messages
    25 483
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : Belgique

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2007
    Messages : 25 483
    Par défaut
    Il n'est pas construit à la compilation, mais à l'exécution, via String.intern() La pluspart des chaines chargées via le classloader sont passée par le pool pour limiter la mémoire, vue le nombre d'endroit où elles peuvent être référencées.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
        String v1 = "java.lang.Object";
        String v2 = "java.lang.Object";
        String v3 = new String("java.lang.Object");
        String v4 = v3.intern();
        String v5 = Object.class.getName();
     
        System.out.println("v1 == v2 --> " + (v1 == v2)); // true
        System.out.println("v1 == v3 --> " + (v1 == v3)); // false
        System.out.println("v1 == v4 --> " + (v1 == v4)); // true
        System.out.println("v1 == v5 --> " + (v1 == v5)); // true

  4. #24
    Modérateur
    Avatar de Alkhan
    Homme Profil pro
    ingénieur full stack
    Inscrit en
    Octobre 2006
    Messages
    1 232
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : ingénieur full stack

    Informations forums :
    Inscription : Octobre 2006
    Messages : 1 232
    Par défaut
    Merci pour ces précisions tchize_ qui sont fortes intéressantes !
    Je rectifie mon poste pour enlever l'erreur
    Il n'y a pas de problème, il n'y a que des solutions.
    Cependant, comme le disaient les shadoks, s'il n'y a pas de solution, c'est qu'il n'y a pas de problème.
    Si toutefois le problème persiste, la seule solution restante est de changer le périphérique qui se trouve entre la chaise et l'écran

    Mes Articles : Mon premier article est sur le language D
    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

  5. #25
    Rédacteur

    Avatar de autran
    Homme Profil pro
    Développeur Java
    Inscrit en
    Février 2015
    Messages
    1 241
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur Java
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Février 2015
    Messages : 1 241
    Billets dans le blog
    55
    Par défaut
    Ok mais revenons à nos moutons, Rhylsadar as tu résolu ton problème ?
    Car lorsque tu es débutant, c'est tout de même frustrant de de ne pas voir ton programme s’exécuter normalement
    Développeur Java
    Site Web

  6. #26
    Membre averti
    Homme Profil pro
    Étudiant
    Inscrit en
    Octobre 2015
    Messages
    12
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Octobre 2015
    Messages : 12
    Par défaut
    Merci à tous pour votre implication, ça fait plaisir de voir un forum aussi réactif ! Ceci étant, je ne peux pas utiliser les solutions que vous me proposez pour la simple et bonne raison que je n'ai pas encore étudier les instructions auxquelles vous faites référence. Je me suis donc débrouillé avec les maigres outils dont je dispose, et j'ai réussi à obtenir un code satisfaisant (pour un débutant) et qui fonctionne :

    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
     
    public class Operation {
    	public static void main(String[] args) {
    		int a, b, res = 1;
    		char c = 'a';
    		boolean test = false;
     
    		Terminal.ecrireStringln("Veuillez entrer un nombre entier: ");
    		a = Terminal.lireInt();
    		Terminal.ecrireStringln("Puis un autre: ");
    		b = Terminal.lireInt();
     
    		while (test == false) {
    			Terminal.ecrireString("Quelle opération souhaitez vous effectuer (entrez un opérateur ) : ");
    			c = Terminal.lireChar();
    			if (c == '+' || c == '-' || c == '*' || c == '/') {
    				test = true;
    			} else {
    				test = false;
     
    			}
    		}
     
    		if (c == '+') {
    			res = a + b;
    		} else if (c == '-') {
    			res = a - b;
    		} else if (c == '*') {
    			res = a * b;
    		} else if (c == '/') {
    			res = a / b;
    		}
     
    		Terminal.ecrireIntln(res);
    	}
     
    }
    Vos critiques et vos commentaires sont les bienvenus .

    Pour en revenir au premier programme :

    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
     
     
    public class Mystere {
    	public static void main(String[] args) {
    		int n;
    		String res = "";
     
    		Terminal.ecrireString("Entrez un nombre positif : ");
    		n = Terminal.lireInt();
    		while (n > 0) {
    			if (n % 2 == 0) {
    				res = '0' + res;
    			} else {
    				res = '1' + res;
    			}
     
    			n = n / 2;
    		}
    		Terminal.ecrireStringln(res);
    	}
    }
    Comme l'a dit Autran ce programme converti un int en langage binaire. Le soucis c'est que je ne vois vraiment pas comment.
    Les lignes que je ne comprends pas sont :

    res = '0' + res

    res = '1' + res

    L'interprétation que j'en fais est nécessairement erronée mais je n'en vois pas d'autre : la première de ces deux instructions met res à 00 et la seconde à 11. A chaque fois que n repasse dans la boucle while, et tant qu'il est strictement supérieur à 0 et qu'il est pair (if (n % 2 == 0) alors res récupère à nouveau 00. Une fois que n devient impair res se voit ajouter 11 et on sort de la boucle. Ce qui veut dire que si l'on prend comme entrée n = 12 on aura 00 puis (12/2=6) 00 puis (6/2=3) 11. Soit 000011. Or 000011 ne code absolument pas 12 en binaire... Je n'ai donc globalement...rien compris

  7. #27
    Rédacteur

    Avatar de autran
    Homme Profil pro
    Développeur Java
    Inscrit en
    Février 2015
    Messages
    1 241
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur Java
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Février 2015
    Messages : 1 241
    Billets dans le blog
    55
    Par défaut
    C'est bien, tu tentes et tu réfléchis donc tu t'approches de la solution

    Quand tu divises par 2 un nombre, le reste ne peut que valoir 1 ou 0. Et c'est ce reste que tu empiles à ta variable res. Cet ajout au sommet de ta pile res se fait grâce à l'opérateur de concaténation de chaine +. Et au final cela te donnes l’écriture binaire de ton nombre.

    voila graphiquement ce que cela donne sur ton exemple n=12
    12/2 = 6 reste --> 0
    6/2 = 3 reste --> 0
    3/2 = 1 reste --> 1
    1/2 = 0 reste --> 1

    et tu lis à l'envers car c'est une pile ce qui te donne bien (1100)2

    PS : L'opérateur / permet de donner le quotient de la division entière.
    Développeur Java
    Site Web

  8. #28
    Expert éminent
    Avatar de tchize_
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2007
    Messages
    25 483
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : Belgique

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2007
    Messages : 25 483
    Par défaut
    Citation Envoyé par Rhylsadar Voir le message

    L'interprétation que j'en fais est nécessairement erronée mais je n'en vois pas d'autre : la première de ces deux instructions met res à 00 et la seconde à 11. A chaque fois que n repasse dans la boucle while, et tant qu'il est strictement supérieur à 0 et qu'il est pair (if (n % 2 == 0) alors res récupère à nouveau 00. Une fois que n devient impair res se voit ajouter 11 et on sort de la boucle. Ce qui veut dire que si l'on prend comme entrée n = 12 on aura 00 puis (12/2=6) 00 puis (6/2=3) 11. Soit 000011. Or 000011 ne code absolument pas 12 en binaire... Je n'ai donc globalement...rien compris
    Allez, il suffit de prendre un papier, un crayon et de noter ce qui se passe
    au départ, n = 12 res=""
    n>0? oui
    n%2==0? oui => res = 0 + "" => res = "0"
    n = n/2 => n = 6
    n>0? oui
    n%2==0? oui => res = 0 + "0" => res = "00"
    n = n/2 => n = 3
    n>0? oui
    n%2==0?non => res = 1 + "00" => res = "100"
    n = n/2 => n = 1
    n>0? oui
    n%2==0?non => res = 1 + "100" => res = "1100"
    n = n/2 => n = 0
    n>0? non
    afficher "1100"

  9. #29
    Membre averti
    Homme Profil pro
    Étudiant
    Inscrit en
    Octobre 2015
    Messages
    12
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Octobre 2015
    Messages : 12
    Par défaut
    Yes !! C'est clair comme de l'eau de roche, c'est la notion de concaténation que je n'avais pas saisi, merci à tous les deux .

+ Répondre à la discussion
Cette discussion est résolue.
Page 2 sur 2 PremièrePremière 12

Discussions similaires

  1. J'ai un probleme tres coriace I need help
    Par red1kissi dans le forum Bases de données
    Réponses: 7
    Dernier message: 16/06/2006, 09h29
  2. Panier virtuel need Help!!
    Par louli_computing dans le forum EDI, CMS, Outils, Scripts et API
    Réponses: 7
    Dernier message: 12/06/2006, 14h53
  3. Récupération xml récalcitrante edit : need help
    Par InDaWinD dans le forum Général Python
    Réponses: 3
    Dernier message: 14/04/2006, 12h28
  4. Need help pour installer upgrade linux Debian
    Par jejerome dans le forum Administration système
    Réponses: 2
    Dernier message: 26/03/2006, 20h26
  5. need help pour : boucle & expression régulière
    Par Fabouney dans le forum Langage
    Réponses: 5
    Dernier message: 05/08/2005, 03h22

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