A relire la r�ponse d'Olivier Cayron, je suppose qu'il voulait dire
"Que ceux qui font toto = new String("toto").intern();
au lieu de toto="TOTO"; me disent pourquoi."
Et l� effectivement la premi�re d�claration n'a pas de sens, sauf si on veut
on ralentir l'ex�cution. Puisque les litteraux sont d�jas d�clar�s en
"static".
A la suite de cette discussion, j'ai une petite question:
Pourquoi un litteral est d�fini comme static ?
En effet intuitivement, je pensais que le code suivant :
String toto1 = "TOTO";
String toto2 = "TOTO";
System.out.println(toto1==toto2)
Aurait pour r�sultat false, au lieu de true. Je pensais donc que
String toto = "TOTO"; �tait un raccourci de programmation pour dire String
toto = new String("TOTO");
Je me trompais, d'accord. Mais qu'est ce qui justifie le choix inverse ? Des
raisons d'optimisations comme j'ai lu dans un bouquin?
Pour moi ca doit rester, au controle du programmeur.En effet, des que j'ai
un litteral je le d�clare comme static (final si besoin est) et la je peux
me permettre de faire mais == dans mes if-then-else car je contr�le ce que
je fais. c'est moi qui fait l'assignement vers sa valeur static.
Finalement, je ne comprends donc pas pourquoi un litteral doit �tre static,
c'est le programmeur qui devrait choisir si oui ou non son litteral doit
�tre static. Enfin, c'est ce que je pense.
Laurent For�t.
----- Original Message -----
From: "Dominique Gallot" <[EMAIL PROTECTED]>
To: <[EMAIL PROTECTED]>
Sent: Monday, March 10, 2003 12:29 PM
Subject: RE: String.intern()
>
> >Que ceux qui font un toto = new String( "TOTO" ) au lieu de
> >toto = "TOTO" me disent pourquoi.
>
>
> Pour avoir des r�f�rences diff�rentes ?
>
>
> >Le code suivant fait exactement la m�me chose (en plus rapide) :
>
> Heeuuuu. non pas vraiment ! Enfin ca fait pas le meme chose ! Mais la
> deuxieme est effectivement plus rapide, mais partage les r�f�rences.
>
>
> String str = "TOTO"; L'object str � �t� creer durant l'initialization de
> la class. c'est un genre d'oject static ( static pool )
> String str = new String("TOTO"); Cela cre� une copie d'une string du
static
> pool de la class.
>
>
> --> Donc
>
>
> Si dans une meme class "STR" == "STR", "STR" != new String("STR") et bien
> sur new String("STR") est diff�rent de new String("STR")
> C'est pas tres clair, mais ...
>
>
> >- Le intern() est beaucoup plus long que le equals, donc pas
> >besoin de l'utiliser si c'est uniquement pour faire 1 seul ==. Par
> >contre, dans une boucle tr�s longue, ca peut �tre int�ressant.
>
>
> Par ex un tableau de 2000 String a comparer avec 2000 autres string. -->
> 2000 * 2000 comparaison !
> Via des equals ==> 461 ms
> Via des intern & == 30 ms dont 10 ms pour les interns. Y pas photo.
> Pour par example un algo de type 'buble sort" c'est interessant, pas pas
> pour un quick sort.
>
>
> Un intern prend 8 X plus de temps qu'un equals.
>
>
> Dominique
>
>
>
>
>
> |---------+---------------------------->
> | | OLIVIER CAYRON |
> | | <[EMAIL PROTECTED]|
> | | rfi.fr> |
> | | |
> | | 10/03/2003 11:25 |
> | | Please respond to|
> | | java |
> | | |
> |---------+---------------------------->
>
>---------------------------------------------------------------------------
---------------------------------------------------|
> |
|
> | To: "'[EMAIL PROTECTED]'" <[EMAIL PROTECTED]>
|
> | cc: (bcc: Dominique Gallot/BRU/MASTERCARD)
|
> | Subject: RE: String.intern()
|
>
>---------------------------------------------------------------------------
---------------------------------------------------|
>
>
>
>
> public String intern() interns a String in the common string
> > memory pool. Example: String potentialNapoleanQuote =
> > new String ("Able was I, ere I saw Elba!");
potentialNapoleanQuote.intern
> ();.
>
>
> Attention, il ne faut pas trop regarde ce code � 2 balles ?
> Que ceux qui font un toto = new String( "TOTO" ) au lieu de
> toto = "TOTO" me disent pourquoi. Le code suivant fait exactement
> la m�me chose (en plus rapide) :
> String potentialNapoleanQuote = "Able was I, ere I saw Elba!";
>
>
> > Il appara�t donc que prefix.intern() permet d'ajouter une cha�ne
> > dans le pool de cha�nes sauvegard� en interne et d'acc�l�rer ensuite
> > la comparaison de deux cha�nes en utilisant l'op�rateur == plut�t que
> > la m�thode equals().
>
>
> C'est exactement cela. Cependant, � retenir :
> - Le intern() est beaucoup plus long que le equals, donc pas
> besoin de l'utiliser si c'est uniquement pour faire 1 seul ==. Par
> contre, dans une boucle tr�s longue, ca peut �tre int�ressant.
> - Les literaux sont automatiquement inclus dans le pool,
> donc ne pas faire "TOTO".intern().
> - Dans l'exemple original, faire un intern pour ensuite faire
> des equals me parait bien inutile.
> - Pour r�pondre � la question initiale, non, ca ne change rien car
> le get d'une HashMap (c'est l'exemple que j'ai regard� pour v�rifier)
> utilise le hashcode et le equals.
>
>
> Olivier
>
>
>
>
>
>
>
>
>
> **********************************************************************
> This email and any files transmitted with it are confidential and
> intended solely for the use of the individual or entity to whom they
> are addressed. If you have received this email in error please notify
> the system manager.
>
> This footnote also confirms that this email message has been swept by
> MIMEsweeper for the presence of computer viruses.
>
> www.mimesweeper.com
> **********************************************************************
>
>