Avatar billede larzy Nybegynder
09. april 2002 - 01:35 Der er 7 kommentarer og
1 løsning

Strings og equality

Så vidt jeg har forstået er det kun de primitive typer i java, der sammenlignes "by value" med operatoren ==
Men jeg kan også sammenligne strings "by value" med ==. Er der en god forklaring på det?

kodeeks
s1 = "abc";
        s2 = s1 + "";
        if(s1==s2)
            System.out.println( "det virker med == for indhold af strings" );
Avatar billede encorez Nybegynder
09. april 2002 - 01:39 #1
nej, brug equels eller compareTo. Hvis du ved hvor du kan finde dokumentaionen for java, kan du selv læse om disse funktioner og se hvilken en der passer dig bedst
Avatar billede encorez Nybegynder
09. april 2002 - 01:39 #2
men ved en ren sammenligning er equals nok den du skal bruge
Avatar billede encorez Nybegynder
09. april 2002 - 01:42 #3
fra www.sun.dk
equals
public boolean equals(Object anObject)
Compares this string to the specified object. The result is true if and only if the argument is not null and is a String object that represents the same sequence of characters as this object.

Overrides:
equals in class Object
Parameters:
anObject - the object to compare this String against.
Returns:
true if the String are equal; false otherwise.
See Also:
compareTo(java.lang.String), equalsIgnoreCase(java.lang.String)
Avatar billede encorez Nybegynder
09. april 2002 - 01:44 #4
dvs. du skriver noget i retning af:

String s = "abc";
String t = "hgf";
if (s.equals(t)){
Dette er sand}
else{Dette er falsk}
Avatar billede greybeard Nybegynder
09. april 2002 - 12:01 #5
Det er der en god forklaring på.
== sammenligner referencer, og de er ens i dit tilfælde, da du har sat den ene streng lig den anden.
D.v.s. at begge referencer peger på det samme. Hvis du ændrer på på den ene, ændrer du samtidigt den anden.
Når du vil sammeligne indhold af to forskellige strenge SKAL du bruge equals. Det andet virker ikke.
compareTo fortæller om den første streng er <, = eller > den anden.
Avatar billede soelvpil Nybegynder
09. april 2002 - 16:08 #6
Hvad med at udføre testen?

String s1 = "brian";
String s2 = "brian";
System.out.println(s1==s2);
Avatar billede jkrag Nybegynder
09. april 2002 - 19:24 #7
Hej Larzy.
Det er et rigtig godt spørgsmål du stiller, og ja, der er et godt svar.
Javas == operator brugt på objecter sammenligner kun object-referencer, og giver derfor true i tilfældet
s1 = "test";
s2 = s1;
System.out.println/s1==s2);
men burde således også fejle i det nævnte tilfælde med
String s1 = "brian";
String s2 = "brian";
System.out.println(s1==s2);
men det gør den ikke.

Forklaringen er den at java vm'en har en særlig string-pulje (af optimeringshensyn). Dette er noget vm'en kan gøre som følge af at String objectet er "imutable" dvs. uforanderligt (dets værdi kan ikke ændres under programkørsel)
Hvis du opretter strenge via konstanter således at de er defineret på kompileringstidspunktet dvs. f.eks.
String s1 = "test";
String s2 = "tester" + " igen";
String s3 = "og "+s2;
så vil den oprette hver entydig streng i strengpuljen netop en gang. Lver du således to ens stenge som i "brian" eksemplet, eller i:
String s1 = "test";
String s2 = "te"+"st";
så vil der kun blive oprettet 1 streng i puljen, og begge object-referencer peger på denne. Dette vil så give det  - principielt forkerte - svar 'true' ved sammenligning af s1 og s2 med == operatoren.
Endnu en af de hærlige undtagelser der er i java omkring netop String :-)

Jeg håber du er blevet klogere af denne forklaring og at det ikke er alt for rodet og forvirende.
Du kan altså principielt godt sammenligne strenge med == men hvis du vil have den effekt man normalt ønsker, skal du bruge equals istedet. Equals er iøvrigt implementeret specifikt på String til at lave fornuftig sammenligning, hvorimod næsten alle andre objecter nedarver metoden fra object hvor den er implementeret som en simpel == sammenligning :-)
Avatar billede larzy Nybegynder
09. april 2002 - 21:07 #8
Til jkrag - tak for det grundige svar, det gjorde det bestemt det hele lidt mindre hokus-pokus agtigt
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Kurser inden for grundlæggende programmering

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester