OVH Cloud OVH Cloud

égalité en Java

15 réponses
Avatar
Julien Arlandis
J'ai une variable lue de type String
lorsque j'affiche :

System.out.println(lue.equals("QUIT"));
System.out.println(lue=="QUIT"));

Je n'ai pas forcement la même valeur de vérité. Quelle est donc la
différence entre la méthode equals() et l'opérateur == ?

5 réponses

1 2
Avatar
vclassine
Julien Arlandis wrote in message news:<401b00f5$0$1168$...
Les expressions régulières comment ça marche en java concrètement?
Je voudrais backslasher mes chaînes de caractères avant de les injecter
dans les requêtes SQL.
Je fais lu = lu.replaceAll("[']","'");
Mais le contenu de lu n'a pas changé!


Si je comprend bien, tu veux remplacer les apostrophes par des
backslash+apostrophe.

la méthode replace all n'interprete rien (pas de regex), elle
recherche donc
crochet+apostrophe+crochet pour le remplacer par une apostrophe.

Pourquoi pas backslash+apostrophe? parce que ' est une séquence
d'échappement (comme toute les séquences X avec X!=) désignant le
caractère apostrophe.
Là où c'est traitre c'est dans les chaines le caractère apostrophe
peut être écrit directement genre "ceci est un 'exemple'" qui est
équivalent à "ceci est un 'exemple'". Alors à quoi sert cette
%$^#@! de séquence d'échappement? Et bien à écrire le caractères
apostrophe en tant que char.

Exemple:

char c = '''; //incorrect

char c = '''; //correct

Pour le backslash soit interprèté comme un caractère et pas un début
de séquence d'échappement il faut le doubler.

Dans ton cas ça donne ça: "'" ou encore "'" le caractère
apostrophe supportant les deux écritures dans les strings...

Pour vraiment faire des regex tu peux utiliser le package
java.util.regex (que je ne connais pas bien, mais qui est (parait-il)
pas mal)...

Une remarque en passant, n'abuses pas trop du newsgroup. Le fait de
vouloir utiliser une regex dans replaceAll() montre que tu n'as pas lu
la doc de cette fonction, et le problème des caractères d'echappements
est généralement connu...

Tu ne peux clairement pas apprendre java sur ce newsgroup (même dans
la faq et les archives), il faut que tu suive le java tutorial ou que
tu te procure un bon bouquin pour débuter ("Java in a Nushell" -
Flanagan -O'Reilly, 4ème édition française, par exemple)...

Il faut chercher un peu plus avant de poster, sinon tu monopolises la
bonne volonté pour des détails et, si tout le monde fait pareil, il
n'y aura plus personne pour répondre aux question auxquel tu ne
pourras pas répondre seul...
Si tu n'as pas chercher dans la doc, la faq, et les archives du
newsgroup pendant au moins 2 heures: ne poste pas... En plus en
cherchant tu apprends plein de trucs...

Bon courage à toi...

Avatar
gloops
Ah bon, il faut éviter ?
Dommage je trouve, parce que question lisibilité, il faut avouer que ==,
c'est quand même nettement au-dessus. Surtout si on compare les
résultats d'imbrications de méthodes ...
______________________________________
Vincent a écrit, le 30/01/2004 16:47 :
Comme ça en réfléchissant 5 minutes je me dit que c'est de
l'optimisation fine qui ne doit pas s'utiliser n'importe comment et
qui ne doit être que rarement utilisée.



(...)

Plus généralement utiliser "==" à la place de equals peut être très
dangereux. A la moindre inatention dans l'affectation des String, ont
se retrouve avec un test d'égalité qui ne fait pas se qu'on attend de
lui, et ce genre de truc est très pénible à chercher parce que ça
n'explose pas...

A utiliser avec parcimonie, selon moi...


--
______________________________________________________________
niark.fr ... Vous avez déjà vu un nom de domaine pareil, vous ?
Complètement gloops, ce mec ...

Avatar
vclassine
gloops wrote in message news:<bvii33$el4$...
Ah bon, il faut éviter ?
Dommage je trouve, parce que question lisibilité, il faut avouer que ==,
c'est quand même nettement au-dessus. Surtout si on compare les
résultats d'imbrications de méthodes ...


C'est un choix à mon avis la règle générale c'est: "pas de ==", mais
éventuellement tu peux déroger ponctuellement si:
- la lisibilité en soufre vraiment.
ET
- la conception ne te permet pas de simplifier les expressions.
ET
- tu as pris toutes les garanties possibles pour ne pas trouver
dans le cas que je cite dans le message précédent...


______________________________________
Vincent a écrit, le 30/01/2004 16:47 :
Comme ça en réfléchissant 5 minutes je me dit que c'est de
l'optimisation fine qui ne doit pas s'utiliser n'importe comment et
qui ne doit être que rarement utilisée.



(...)

Plus généralement utiliser "==" à la place de equals peut être très
dangereux. A la moindre inatention dans l'affectation des String, ont
se retrouve avec un test d'égalité qui ne fait pas se qu'on attend de
lui, et ce genre de truc est très pénible à chercher parce que ça
n'explose pas...

A utiliser avec parcimonie, selon moi...




Avatar
Vincent Brabant
gloops wrote in message news:<bvii33$el4$...

Ah bon, il faut éviter ?
Dommage je trouve, parce que question lisibilité, il faut avouer que ==,
c'est quand même nettement au-dessus. Surtout si on compare les
résultats d'imbrications de méthodes ...



C'est un choix à mon avis la règle générale c'est: "pas de ==", mais
éventuellement tu peux déroger ponctuellement si:
- la lisibilité en soufre vraiment.
ET
- la conception ne te permet pas de simplifier les expressions.
ET
- tu as pris toutes les garanties possibles pour ne pas trouver
dans le cas que je cite dans le message précédent...

Pas du tout d'accord.


Le problème n'est pas lié à la lisibilité ou la simplification des expressions ou toute autre chose encore.

Tu peux TOUJOURS utiliser == pour tout ce qui est primitives (boolean, int, long, ...)
Tu DOIS TOUJOURS utiliser == pour les variables d'objets, si tu veux être sûr qu'ils font référence au même emplacement mémoire.
Tu DOIS TOUJOURS utiliser equals() pour les variables d'objets, si tu veux être sûr que leur contenu soient le même, mais ils peuvent être deux objets mémoire différents.

En résumé:
== retourne TRUE si la variable pointe vers la même adresse mémoire.
.equals() retourne TRUE si le contenu est le même.

Le programmeur a la possibilité de faire un "override" de equals, mais pas de =




______________________________________
Vincent a écrit, le 30/01/2004 16:47 :

Comme ça en réfléchissant 5 minutes je me dit que c'est de
l'optimisation fine qui ne doit pas s'utiliser n'importe comment et
qui ne doit être que rarement utilisée.



(...)


Plus généralement utiliser "==" à la place de equals peut être très
dangereux. A la moindre inatention dans l'affectation des String, ont
se retrouve avec un test d'égalité qui ne fait pas se qu'on attend de
lui, et ce genre de truc est très pénible à chercher parce que ça
n'explose pas...

A utiliser avec parcimonie, selon moi...





--
Vincent Brabant
----------------
http://www.netbeans.org/index_fr.html
http://vbrabant-fr.skynetblogs.be



Avatar
vclassine
Vincent Brabant wrote in message news:<401e166b$0$766$...
gloops wrote in message news:<bvii33$el4$...

Ah bon, il faut éviter ?
Dommage je trouve, parce que question lisibilité, il faut avouer que ==,
c'est quand même nettement au-dessus. Surtout si on compare les
résultats d'imbrications de méthodes ...



C'est un choix à mon avis la règle générale c'est: "pas de ==", mais
éventuellement tu peux déroger ponctuellement si:
- la lisibilité en soufre vraiment.
ET
- la conception ne te permet pas de simplifier les expressions.
ET
- tu as pris toutes les garanties possibles pour ne pas trouver
dans le cas que je cite dans le message précédent...



Pas du tout d'accord.


Le problème n'est pas lié à la lisibilité ou la simplification des expressions ou toute autre chose encore.

A mon avis tu aurais du lire le thread intégralement avant de monter

sur tes grands chevaux...


Tu peux TOUJOURS utiliser == pour tout ce qui est primitives (boolean, int, long, ...)
ça tombe sous le sens, il faudrait être tordu pour encapsuler les

types primitif dans leurs équivalents objet afin de les comparer, a
fortiori avec "==".

Pour info personne n'a parlé des types primitifs...


Tu DOIS TOUJOURS utiliser == pour les variables d'objets, si tu veux être sûr qu'ils font référence au même emplacement mémoire.
Ben oui equals ne s'applique pas...


Tu DOIS TOUJOURS utiliser equals() pour les variables d'objets, si tu veux être sûr que leur contenu soient le même, mais ils peuvent être deux objets mémoire différents.


Désolé mais non, tu peux utiliser si == te renvoie true, tu es sûr que
les contenus sont identiques. Le problème c'est d'être sur que le
contenu n'est pas équivalent.

Si tu maitrise la production des objets en t'assurant qu'a chaque
contenu différent correspond une référence unique tu es tranquille
pour utiliser == à la place de equals(). Mais ces cas sont
relativement rares, et généralement une conception différentes aurait
été une meilleur solutions... C'est une pratique douteuse, mais
j'imagine qu'il y a des cas ou c'est justifiable...

En résumé:
== retourne TRUE si la variable pointe vers la même adresse mémoire.
.equals() retourne TRUE si le contenu est le même.
Déjà dit en long et large et en travers dans le thread...


A+



1 2