Na druhe strane, divil bych se, kdyby vam intern()-ovani _dat_ ve vasich
programech neco vyznamneho prineslo.
Jednak String.intern() nejakou dobu trva, jednak je nejasne, jak se ten
pool chova. Tady se nabizeji dve moznosti:

1. Jednou intern()-ovany retezec zustava v poolu do konce vesmiru (cti:
spustene instance JVM).
Pak Vam snadno muze dojit pamet, zejmena pokud jste na serveru.
Efektivne si omezujete bud pocet obslouzenych pozadavku, nebo velikost
dat, se kterou muzete pracovat, ikdyz mate nakrasne algoritmy s
konstantni pametovou narocnosti.

2. Intern()-ovany retezec zustava v poolu jen dotud, dokud jsou na nej
reference.
Pak je Vam takove intern()-ovani napriklad radku souboru CSV (nebo radku
vysledku dotazu JDBC, nebo libovolneho jineho najednou zpracovavaneho
useku dat) vcelku na nic. Nez prejdete k novemu radku, pool zapomene
veci z radku stareho. Pak Vas to intern()-ovani jenom zdrzuje.

Sun Java 1.5.0 se, zda se, chova druhym z uvedenych zpusobu. Ale
specifikaci takoveto chovani dane neni, takze na ne neni dobre spolehat.

Myslim, ze intern() ma cenu pouzivat jen, pokud vite, ze v tom kusu dat,
ktery musite mit najednou v pameti, se budou retezce vyznamnou merou
opakovat. Z hlediska aplikacniho programatora to podle mne patri do
podobne kategorie krehotinek jako java.lang.System.gc().

Jinak pokud vsude pisi, ze objekty se na rovnost maji porovnavat metodou
equals(), tak bych se toho drzel i u Stringu. I kdyz se je nyni
rozhodnete intern()-ovat. JVM-ko bude na equals() optimalizovano, takze
ve vysledku strojove cykly treba ani neusetrite, nebo jen zanedbatelne.
Co je vsak dulezitejsi, vas kod bude standardni a vy se muzete
spolehnout, ze dokud bude Java Javou, nebudete na tomto aspektu vaseho
kodu muset nic menit. I kdyz se treba v budoucnu rozhodnete
ne-intern()-ovat, nebo to intern()-ovani na jednom z x mist zapomenete.

Ale co je ze vseho nejdulezitejsi, takovy kod bude daleko
srozumitelnejsi ostatnim.
Pocitaje v to vas po pul roce. :-)

Honza Dvorak


ales napsal:
> Myslim si, ze ano. Aj ked zmysel by to malo hlavne v tom pripade keby
> vstup z konzoly obsahoval duplicitne retazce. Nieco v zmysle kodu
> krajiny v CSV subore. V pripade, ze by boli hodnoty vzdy ine tak to
> zmysel nema.
>
> Ales
>
>
>
> Kamzik-II  wrote / napísal(a):
>> Dobre, rekneme, ze budu od uzivatele
>> nacitat nejake retezce z konzole a budu je ukladat
>> do nejakeho Listu, ale do Listu budu pridavat
>> internovane retezce, tak usetrim pamet a muzu pouzivat
>> porovnavani pomoci ==, je to tak?
>>
>> ----- Original Message ----- From: "ales" <[EMAIL PROTECTED]>
>> To: "Java" <[email protected]>
>> Sent: Thursday, September 28, 2006 12:15 PM
>> Subject: Re: java.lang.String.intern()
>>
>>
>>> Ahoj,
>>> je to presne tak. Nasledujuci kod:
>>>
>>>        String helloWorld = "HelloWorld";
>>>        String hello = "Hello";
>>>        String world = "World";
>>>        System.out.println(helloWorld == (hello + world).intern());
>>>
>>> vypise true. Metoda intern existuje z optimalizacnych dovodov (vid
>>> http://en.wikipedia.org/wiki/String_intern_pool).
>>>
>>> Ales
>>>
>>>
>>>
>>> Ing. Jan Novotný  wrote / napísal(a):
>>>> Nejsem si jistý, ale nezajistí se touto metodou, že konkrétní
>>>> string bude na haldě pouze jednou? Tzn. že je teoreticky možné toto:
>>>>
>>>> String a = "ahoj";
>>>> String b = "ahoj";
>>>> if (a != b) System.out.println("a different from b"); //mohlo by se
>>>> vypsat
>>>> a.intern();
>>>> b.intern();
>>>> if (a == b) System.out.println("a same as b"); //musí se vypsat
>>>>
>>>> Nejsem si tím jistý, ale myslím, že takhle to funguje ... equals
>>>> samozřejmě vrátí v obou případech true (imlementace equals u
>>>> stringu myslím interně to intern právě volá).
>>>>
>>>> Honza
>>>>
>>>> Kamzik-II napsal(a):
>>>>> Zdravim diskuzi, mam opet jeden zacatecnicky dotaz :)
>>>>> Tentokrat by me zajimalo, jake vyuziti ma metoda intern ()
>>>>> tridy java.lang.String, zaujalo me tohle:
>>>>>  String helloWorld = "HelloWorld";
>>>>> String hello = "Hello";
>>>>> String world = "World";
>>>>>  helloWorld == ( hello + world ).intern ();
>>>>>  mohl by mi nekdo vysvetlit k cemu je tato
>>>>> metoda dobra? :)

Odpovedet emailem