Navigacija
Lista poslednjih: 16, 32, 64, 128 poruka.

U vezi stringova

[es] :: Java :: U vezi stringova

[ Pregleda: 2893 | Odgovora: 9 ] > FB > Twit

Postavi temu Odgovori

Autor

Pretraga teme: Traži
Markiranje Štampanje RSS

krstak84
student

Član broj: 210622
Poruke: 64
*.dynamic.sbb.rs.



Profil

icon U vezi stringova05.03.2009. u 07:33 - pre 155 meseci
Zanima me da li neko zna koja je razilika izmedju :

String s1 = "rec";

i

String s1 = new String("rec"); ?

Da li bi neko mogao da mi ukratko objasni i kako se alocira memorija kod prve naredbe, a kako kod druge?

Pitam zato sto ne znam zasto je rezultat u ova dva slucaja razlicit :

1 Slucaj :

String s1 = new String("rec");
String s2 = new String("rec");

if(s1 == s2)
resenje : false


2 Slucaj :

String s1 = "rec";
String s2 = "rec";

if(s1 == s2)
resenje : true

Kapiram zasto je u prvom slucaju false, zato sto poredi reference, a posto se one razlikuju i rezultat je false, ali zasto je u drugom slucaju true?, zar ne treba i tu da poredi reference ?

Unapred hvala na odgovoru.
 
Odgovor na temu

anon315

Član broj: 315
Poruke: 1657
*.adsl-4.sezampro.yu.



+13 Profil

icon Re: U vezi stringova05.03.2009. u 08:45 - pre 155 meseci
http://www.devx.com/tips/Tip/12843

http://java.sun.com/j2se/1.5.0/docs/api/java/lang/Object.html (pogledaj equals metodu)
 
Odgovor na temu

cteba
ns

Član broj: 52625
Poruke: 69
*.ns.ac.yu.



+1 Profil

icon Re: U vezi stringova05.03.2009. u 09:55 - pre 155 meseci
Mislim da u drugom slucaju kompajler prilikom optimizacije koda prepozna da je u pitanju ista stvar na dva mesta, pa napravi samo jedan objekat na koga upucuju obe reference (String je immutable, pa moze), pa ti zato if ( s1 == s2 ) vrati true.
U prvom slucaju ti eksplicitno kazes da se naprave dva objekta i onda oni imaju razlicite reference, pa ti provera jednakosti referenci vraca false.

U svakom slucaju kako ti je Vanja rekao za proveru String-ova (i ostalih objekata) koristi metodu equals.

Pokusaj u drugom slucaju da sacuvas stringove u neki strim, pa ih ucitaj i poredi ponovo sa == , pa vidi sta se desava. :)
 
Odgovor na temu

krstak84
student

Član broj: 210622
Poruke: 64
*.air.tehnicom.net.



Profil

icon Re: U vezi stringova05.03.2009. u 11:40 - pre 155 meseci
Znam ja da stringove treba porediti sa equals, nije to problem, mene konkretno zanima razlika izmedju :

String s1 = new String("rec");
i
String s2 = "rec";

Negde sam procitao da = new String("rec"); ne treba koristiti vec samo ="rec";, ali ne znam zasto, tamo samo pise da je bolje zbog memorije.
Nadam se da neko zna odgovor na ovo pitanje.

 
Odgovor na temu

anon315

Član broj: 315
Poruke: 1657
93.86.221.*



+13 Profil

icon Re: U vezi stringova05.03.2009. u 16:08 - pre 155 meseci
Ja bih rekao da je potpuno svejedno, vec je prosto varijanta sa ... = "bla" skracenica za ... = new String ("bla"), jer se cesto koriste stringovi..

U oba slucaja imas ovo:



Ali onda i dalje ostaje pitanje koje si postavio, verovatno je cteba u pravu ;)
 
Odgovor na temu

del-boy
Bojan Delić
Beograd

Član broj: 9330
Poruke: 1089

Sajt: www.delic.in.rs


+21 Profil

icon Re: U vezi stringova05.03.2009. u 17:40 - pre 155 meseci
Hm, ja mislim da baš i nije svejedno.

U slučaju kad radiš String s1 = new String("bla"); kompajler prvo napravi string "bla", zatim pozove konstruktor String(String s) i iskoripira s u novonastali string (s je u ovom slučaju "bla"). Ono što je rezultat je da je dva puta alocirana memorija za isti string, a onaj koji je prvi nastao ostaje da visi da ga GC pokupi. Nisam se mnogo upuštao u ovu priču, ali tako je to meni objašnjeno :). Moja pretpostavka je da je ovo ostavljeno ovako (i da se ne radi samo prevezivanje, nego deep copy stringa) da bi programer imao mogućnost da napravi dva ista stringa na različitim pozicijama u memoriji.

Mislim da je to više predviđeno da se koristi prilikom kreiranja novog stringa od neke promenljive, a ne od hardcode-ovanog stringa, samo mu treba otkriti pravu namenu...

Evo šta kaže dokumentacija u vezi String(String original) konstruktora:
Citat:

Initializes a newly created String object so that it represents the same sequence of characters as the argument; in other words, the newly created string is a copy of the argument string. Unless an explicit copy of original is needed, use of this constructor is unnecessary since Strings are immutable.
 
Odgovor na temu

krstak84
student

Član broj: 210622
Poruke: 64
*.dynamic.sbb.rs.



Profil

icon Re: U vezi stringova06.03.2009. u 05:12 - pre 155 meseci
Da, da, ja mislim da je ovo sto je del-boy rekao tacno, jer sam u jednoj knjizi, kao sto rekoh, procitao da nikada ne koristimo new String(String s) zbog memorije, jer nepotrebno pravimo jos jedan objekat.

Sada me samo buni ovaj drugi slucaj, mozda je cteba u pravu, ali onda to znaci da pri kreiranju novog stringa svaki put se proverava da li u memoriji postoji takav string i ako postoji povezuje se sa njim...... ?
 
Odgovor na temu

Chobicus
Pancevo

Član broj: 28286
Poruke: 135
*.mozzartbet.com.

ICQ: 31049018


+12 Profil

icon Re: U vezi stringova06.03.2009. u 09:01 - pre 155 meseci
cteba je u pravu.
Code:

String s3 = "recrec";
String s4 = "rec"+"rec";

System.out.println(s3 == s4) ;        //true


String s1 = "recrec";
String s5 = "rec";
String s2 = "rec"+s5;

System.out.println(s1 == s2) ;         //false
s2 = s2.intern();
System.out.println(s1 == s2) ;         //true


Ćapljeno iz http://www.amazon.com/Beginning-Java-2-Ivor-Horton/dp/1861002238

Citat:
cteba: Mislim da u drugom slucaju kompajler prilikom optimizacije koda prepozna da je u pitanju ista stvar na dva mesta, pa napravi samo jedan objekat na koga upucuju obe reference (String je immutable, pa moze), pa ti zato if ( s1 == s2 ) vrati true.
U prvom slucaju ti eksplicitno kazes da se naprave dva objekta i onda oni imaju razlicite reference, pa ti provera jednakosti referenci vraca false.

U svakom slucaju kako ti je Vanja rekao za proveru String-ova (i ostalih objekata) koristi metodu equals.

Pokusaj u drugom slucaju da sacuvas stringove u neki strim, pa ih ucitaj i poredi ponovo sa == , pa vidi sta se desava. :)
 
Odgovor na temu

cteba
ns

Član broj: 52625
Poruke: 69
77.46.177.*



+1 Profil

icon Re: U vezi stringova06.03.2009. u 11:46 - pre 155 meseci
Moj prvi odgovor je bio moje misljenje, a Chobicus me je naveo i na pravo objasnjenje (preuzeto iz Java dokumentacije - klasa String):

public String intern()

Returns a canonical representation for the string object.

A pool of strings, initially empty, is maintained privately by the class String.

When the intern method is invoked, if the pool already contains a string equal to this String object as determined by the equals(Object) method, then the string from the pool is returned. Otherwise, this String object is added to the pool and a reference to this String object is returned.

It follows that for any two strings s and t, s.intern() == t.intern() is true if and only if s.equals(t) is true.

All literal strings and string-valued constant expressions are interned.
 
Odgovor na temu

franticnick

Član broj: 19656
Poruke: 372
*.cable.casema.nl.

Sajt: www.franticnick.com


+30 Profil

icon Re: U vezi stringova06.03.2009. u 21:42 - pre 155 meseci
Ako neko sprema ispit "SUN Certified Java Programmer", upravo ovo sa String pool-om moze da ocekuje medju zadacima. Isto ima fora i da se StringBuffer i StringBuilder instance ne mogu porediti .equals() metodom.
 
Odgovor na temu

[es] :: Java :: U vezi stringova

[ Pregleda: 2893 | Odgovora: 9 ] > FB > Twit

Postavi temu Odgovori

Navigacija
Lista poslednjih: 16, 32, 64, 128 poruka.