/ Forside / Teknologi / Udvikling / Java / Nyhedsindlæg
Login
Glemt dit kodeord?
Brugernavn

Kodeord


Reklame
Top 10 brugere
Java
#NavnPoint
molokyle 3688
Klaudi 855
strarup 740
Forvirret 660
gøgeungen 500
Teil 373
Stouenberg 360
vnc 360
pmbruun 341
10  mccracken 320
Hvad er forskellen på String a = new Strin~
Fra : Michael


Dato : 21-01-01 13:00

Er der nogen der kan fortælle mig hvad forskellen er på disse 2 linier? Hvis
der altså er forskel.

String vHentData = new String("bla");
String vHentData = "bla";

/md



 
 
Claus Christiansen (21-01-2001)
Kommentar
Fra : Claus Christiansen


Dato : 21-01-01 13:30


"Michael" <michael@danwebportal.com> wrote in message
news:MbAa6.6483$l57.191905@news000.worldonline.dk...
> Er der nogen der kan fortælle mig hvad forskellen er på disse 2 linier?
Hvis
> der altså er forskel.
>
> String vHentData = new String("bla");
> String vHentData = "bla";

Udover at den ene er længere end den anden, så er der ingen forskel (correct
me if im wrong!)
Claus
--
Claus Christiansen, TeamD member <cch@unipeople.dk>

Pythia: http://www.pythia.dk
Personal: http://www.bigfoot.com/~kruc
============================================-------------------------
"Gravitation can not be held responsible for people falling in love"
A. Einstein



Sven Nielsen (04-02-2001)
Kommentar
Fra : Sven Nielsen


Dato : 04-02-01 17:06

In article <fXAa6.3096$fa3.188742@news010.worldonline.dk>,
cch@unipeople.dk says...

> > String vHentData = new String("bla");
> > String vHentData = "bla";

> Udover at den ene er længere end den anden, så er der ingen forskel (correct
> me if im wrong!)

Jo, der er en forskel (hvis ikke en god compiler optimerer den væk). I
det andet tilfælde får du oprettet en enkelt instans af String. I det
første tilfælde får du oprettet to! Nemlig den du laver med "", og den
ekstra, som du selv beder om med new.

Derfor er den anden linje den bedste udgave at bruge.

Med venlig hilsen Sven.

Morten Nedertoft (05-02-2001)
Kommentar
Fra : Morten Nedertoft


Dato : 05-02-01 07:55

Sven Nielsen wrote:
>
> In article <fXAa6.3096$fa3.188742@news010.worldonline.dk>,
> cch@unipeople.dk says...
>
> > > String vHentData = new String("bla");
> > > String vHentData = "bla";
>
> > Udover at den ene er længere end den anden, så er der ingen forskel (correct
> > me if im wrong!)
>
> Jo, der er en forskel (hvis ikke en god compiler optimerer den væk)

Jeg synes ikke, at en god compiler skal aendre i det man har skrevet -
medmindre at det bevisligt ikke medfoerer nogen (programmatisk) synlig
aendring af det koerte program.

> Derfor er den anden linje den bedste udgave at bruge.

Under normale omstaendigheder, ja.

mvh. Morten N

Kasper Nielsen (05-02-2001)
Kommentar
Fra : Kasper Nielsen


Dato : 05-02-01 10:21

hah?
Er det fordi vi snakker bytecode her?
Eller er det noget du mener generalt om "gode" compilere?

- Kasper

> Jeg synes ikke, at en god compiler skal aendre i det man har skrevet -
> medmindre at det bevisligt ikke medfoerer nogen (programmatisk) synlig
> aendring af det koerte program.
>
> > Derfor er den anden linje den bedste udgave at bruge.
>
> Under normale omstaendigheder, ja.
>
> mvh. Morten N



Morten Nedertoft (05-02-2001)
Kommentar
Fra : Morten Nedertoft


Dato : 05-02-01 11:33

Kasper Nielsen wrote:
>
> hah?
> Er det fordi vi snakker bytecode her?
> Eller er det noget du mener generalt om "gode" compilere?

Mig ikke forstaa dit spoergsmaal.

mvh. Morten N

Simon Mikkelsen (21-01-2001)
Kommentar
Fra : Simon Mikkelsen


Dato : 21-01-01 14:58

D. Sun, 21 Jan 2001 13:00:09 +0100 syntes "Michael"
<michael@danwebportal.com> at dk.edb.programmering.java skulle vide at
<MbAa6.6483$l57.191905@news000.worldonline.dk>.

>Er der nogen der kan fortælle mig hvad forskellen er på disse 2 linier? Hvis
>der altså er forskel.
>
>String vHentData = new String("bla");
>String vHentData = "bla";

Ingen.
Selvom en String er et objekt, har den alligevel lidt særstatus i forhold
til "almindelige" objekter. Fx. her i anden linie hvor constructoren
automatisk kaldes og referenceparametren automatisk lagres i vHentData,
selvom du ikke bruger new operatoren.

--
Mvh. Simon Mikkelsen, stud. ing.

www.zipban.dk - gratis reklame til din hjemmeside

Morten Nedertoft (21-01-2001)
Kommentar
Fra : Morten Nedertoft


Dato : 21-01-01 17:42

Michael wrote:
>
> Er der nogen der kan fortælle mig hvad forskellen er på disse 2 linier? Hvis
> der altså er forskel.
>
> String vHentData = new String("bla");
> String vHentData = "bla";

Jeg mener at nederste linie svarer til

String vHentData = new String("bla").intern();

Maaske har JVM'en en smutvej til String-klassens kode, saa "bla" findes
uden foerst at skabe et objekt. Jeg kunne forestille mig noget i stil
med

String vHentData = String.getInterned("bla");

mvh. Morten N

Michael (21-01-2001)
Kommentar
Fra : Michael


Dato : 21-01-01 18:12

Tak skal i havde alle sammen.
/md



Ulrik Magnusson (21-01-2001)
Kommentar
Fra : Ulrik Magnusson


Dato : 21-01-01 19:19

> Er der nogen der kan fortælle mig hvad forskellen er på disse 2 linier? Hvis
> der altså er forskel.

> String vHentData = new String("bla");

Efter oversættelse med javac (JDK 1.2.2) laves der følgende byte code:

0 new #4 <Class java.lang.String> // alloker hukommelse til et String objekt

3 dup // kopier øverste værdi på
stakken
4 ldc #1 <String "bla"> // ren magi
6 invokespecial #6 <Method java.lang.String(java.lang.String)> //
initialiser objektet


> String vHentData = "bla";

Efter oversættelse med javac (JDK 1.2.2) laves der følgende byte code:

0 ldc #1 <String "bla"> // ren magi

Der skal altså i hvert fald køres flere instruktioner i det første eksempel. Nu
ville det så være rart hvis en
eller anden ville fortælle, hvad <String "bla"> egentlig gør (bør gøre)?

Det store spørgsmål er måske, om en compiler der oversætter
String vHentData = new String("bla");
til
ldc #1 <String "bla">.
er korrekt?

Ulrik Magnusson



Niels Ull Harremoës (21-01-2001)
Kommentar
Fra : Niels Ull Harremoës


Dato : 21-01-01 22:33

Og for at udlægge denne bytekode for hvide mennesker betyder det at hvis jeg
skriver:

String s1 = new String("bla");
String s2 = "bla";
System.out.writeln("s1 == \"bla\": " + (s1 == "bla" ) );
System.out.writeln("s2 == \"bla\": " + (s1 == "bla" ) );

får jeg

s1 == "bla": false
s2 == "bla": true

Det er derfor man altid skal sammenligne Strings med equals metoden.

MvH
Niels Ull Harremoës



Ulrik Magnusson (21-01-2001)
Kommentar
Fra : Ulrik Magnusson


Dato : 21-01-01 23:47

> String s1 = new String("bla");
> String s2 = "bla";
> System.out.writeln("s1 == \"bla\": " + (s1 == "bla" ) );
> System.out.writeln("s2 == \"bla\": " + (s1 == "bla" ) );
> får jeg
> s1 == "bla": false
> s2 == "bla": true
> Det er derfor man altid skal sammenligne Strings med equals metoden.

Eller bruge intern() :

String s1 = new String("bla");
String s2 = "bla";
System.out.println("s1 == \"bla\": " + (s1.intern() == "bla" ) );
System.out.println("s2 == \"bla\": " + (s2 == "bla" ) );

Hvilket giver:

s1 == "bla": true
s2 == "bla": true

Ulrik Magnusson


Søg
Reklame
Statistik
Spørgsmål : 177552
Tips : 31968
Nyheder : 719565
Indlæg : 6408849
Brugere : 218887

Månedens bedste
Årets bedste
Sidste års bedste