/ 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
Brug af String vs. StringBuffer
Fra : Flare


Dato : 29-01-03 23:58

Jeg er ved at lave en hjemmeopgave i Java. (nybegynder)

Jeg har fx
===============
public class Ansatte {
String navn;

Ansatte() {
navn = new String("unknown");
}
void setNavn(String na) {
navn = na;
}
===============

Dette virker bare ikke. Er der en måde hvorpå jeg kan få ændret en oprettet
String? Hvis jeg bruger StringBuffer virker det fint men den passer ikke
særlig godt til ddet jeg skal lave + opgaven er stillet med klassevariablen
navn som String. Der forskrives også at "navn" skal have en set funktion.

Så mit egentlige spørgsmål er hvordan jeg får lavet en set funktion for en
variable af typen String.

Mvh
Anders



 
 
Trygleren [9000] (30-01-2003)
Kommentar
Fra : Trygleren [9000]


Dato : 30-01-03 02:51

Jeg ved ikke helt hvor den er gået galt for dig, men jeg har tilladt mig at
kopiere din kode ind i en fil:

---------------
public class Ansatte {
String navn;

public Ansatte() {
navn = new String("unknown");
}
public void setNavn(String na) {
navn = na;
}
public String getNavn()
{
return navn;
}

public static void main(String[] args)
{
Ansatte a = new Ansatte();
a.setNavn("Kaj");
System.out.println(a.getNavn());
}
}

--------------------

Dette virker fint.

> Jeg har fx

Måske hvis du gav os en direkte kopi af hvad du har, i stedet for
eksempelkode, så kan vi hurtigere finde frem til en eventuel fejl.

--
"Sic gorgiamus allos subjectatos nunc"
Lars 'Trygleren' Winther

www.hesteskelet.dk




Niels Teglsbo (30-01-2003)
Kommentar
Fra : Niels Teglsbo


Dato : 30-01-03 02:57

"Flare" <dct_flare@hotmail.com> wrote:

> Jeg er ved at lave en hjemmeopgave i Java. (nybegynder)
>
> Jeg har fx
> ===============
> public class Ansatte {
> String navn;
>
> Ansatte() {
> navn = new String("unknown");
> }
> void setNavn(String na) {
> navn = na;
> }
> ===============
>
> Dette virker bare ikke. Er der en måde hvorpå jeg kan få ændret en oprettet
> String?

Nej, men du kan sagtens tildele en anden String til en variabel, og det gør
du korrekt.

Den længere forklaring er, at objekt-variable i virkeligheden er en peger
(pointer) til et objekt, så selvom man ikke kan ændre i objektet kan man
godt få objekt-variablen til at pege på et anden objekt.

Hvad er det, der ikke virker? Oversætter det ikke?

Andre forslag:

Jeg ville nok lade konstruktøren og setNavn være public og huske den sidste
"}", men ellers burde det da oversætte.

Desuden kan du i konstruktøren i stedet for at skrive

navn = new String("unknown");

nøjes med at skrive

navn = "unknown";

Da "unknown" er en String. Normal ville man nok også lade konstruktøren
tage navn som parameter, så objekter altid er i en ordentlig tilstand. Og
så ville jeg personligt kalde klassen for Ansat, da hvert objekt kun
indeholder data for én ansat.

> Så mit egentlige spørgsmål er hvordan jeg får lavet en set funktion for en
> variable af typen String.

Som du har gjort.

--
Niels, The Offspring Mailinglist www.image.dk/~teglsbo

Flare (30-01-2003)
Kommentar
Fra : Flare


Dato : 30-01-03 15:14

Ved sgu ikke hvad jeg har lavet. I min egen kode virkede det ikke. Men hvis
jeg selv kører det jeg skrev virker det. Så OK. Sowy.

> navn = new String("unknown");
> nøjes med at skrive
> navn = "unknown";

Hvad er forskellen ved disse to måder? Hvis der er en altså.

Anders




soren (30-01-2003)
Kommentar
Fra : soren


Dato : 30-01-03 17:28

"Flare" <dct_flare@hotmail.com> writes:

> Ved sgu ikke hvad jeg har lavet. I min egen kode virkede det ikke. Men hvis
> jeg selv kører det jeg skrev virker det. Så OK. Sowy.
>
> > navn = new String("unknown");
> > nøjes med at skrive
> > navn = "unknown";
>
> Hvad er forskellen ved disse to måder? Hvis der er en altså.

"unknown" er implicit en String. new String("unknown") laver
altsaa 2 objekter: Strengen "unknown" og derefter kalder du
copy-constructor String(String) og faar endnu et String objekt.

F.eks. "unknown".indexOf("u") er validt.


Mvh, Soren.


Martin Kofoed (30-01-2003)
Kommentar
Fra : Martin Kofoed


Dato : 30-01-03 20:09

soren wrote:

> F.eks. "unknown".indexOf("u") er validt.

Eller "".equals(strVar), som er handy hvis man ikke er sikker på, om strVar
er null eller ej. Dermed undgår man NullPointerException.


--

Martin

Niels Teglsbo (30-01-2003)
Kommentar
Fra : Niels Teglsbo


Dato : 30-01-03 17:39

"Flare" <dct_flare@hotmail.com> wrote:

> > navn = new String("unknown");
> > nøjes med at skrive
> > navn = "unknown";
> Hvad er forskellen ved disse to måder? Hvis der er en altså.

I Java er "unknown" en nem måde at oprette et objekt af typen String med
det givne indhold.

new String("unknown") bruger Strings konstruktør:

public String(String original)

der tager en String og laver en ny String med samme indhold.

Men hvis man allerede har en String, er der ingen grund til at kalde
Strings konstruktør for at få en ny String med samme indhold, man kan jo
lige så godt bruge den String man har i forvejen.

--
Niels, The Offspring Mailinglist www.image.dk/~teglsbo

Flare (30-01-2003)
Kommentar
Fra : Flare


Dato : 30-01-03 19:13

> Men hvis man allerede har en String, er der ingen grund til at kalde
> Strings konstruktør for at få en ny String med samme indhold, man kan jo
> lige så godt bruge den String man har i forvejen.

Aha. Takker til jer alle.

Mvh
Anders



Martin Kofoed (30-01-2003)
Kommentar
Fra : Martin Kofoed


Dato : 30-01-03 20:07

Flare wrote:

>> navn = new String("unknown");
>> navn = "unknown";
>
> Hvad er forskellen ved disse to måder? Hvis der er en altså.

Forskellen er, at du opretter to String instanser. Den ene med "new
String(...)" og den anden med "unknown". Det er no-no - det må du ikke.
Hvis du gør det samme i en løkke, kan du ende op med millioner af String
instanser til ingen verdens nytte.

Så derfor: metode 2 er den eneste rigtige.


--

Martin

Jesper Lillesoe (31-01-2003)
Kommentar
Fra : Jesper Lillesoe


Dato : 31-01-03 12:59

On Thu, 30 Jan 2003 20:07:02 +0100, Martin Kofoed wrote:

> Flare wrote:
>
>>> navn = new String("unknown");
>>> navn = "unknown";
>>
>> Hvad er forskellen ved disse to måder? Hvis der er en altså.
>
> Forskellen er, at du opretter to String instanser. Den ene med "new
> String(...)" og den anden med "unknown". Det er no-no - det må du ikke.
> Hvis du gør det samme i en løkke, kan du ende op med millioner af String
> instanser til ingen verdens nytte.

Er du sikker på det?

Skriver man "unknown" bliver den vel på compile-time puttet i en
litteral-pool og gør derfor ingen skade. Og new String(et eller andet)
kan jo garbage-collectes? Vi kan hurtigt blive enige om fordelen ved
StringBuffer!! Jeg prøver bare at forstå...

--
Jesper
Der ikke har taget en Java-certification

Michael Banzon (31-01-2003)
Kommentar
Fra : Michael Banzon


Dato : 31-01-03 14:41

Jesper Lillesoe wrote:
> On Thu, 30 Jan 2003 20:07:02 +0100, Martin Kofoed wrote:
>
>
>>Flare wrote:
>>
>>
>>>>navn = new String("unknown");
>>>>navn = "unknown";
>>>
>>>Hvad er forskellen ved disse to måder? Hvis der er en altså.
>>
>>Forskellen er, at du opretter to String instanser. Den ene med "new
>>String(...)" og den anden med "unknown". Det er no-no - det må du ikke.
>>Hvis du gør det samme i en løkke, kan du ende op med millioner af String
>>instanser til ingen verdens nytte.
>
>
> Er du sikker på det?
>
> Skriver man "unknown" bliver den vel på compile-time puttet i en
> litteral-pool og gør derfor ingen skade. Og new String(et eller andet)
> kan jo garbage-collectes? Vi kan hurtigt blive enige om fordelen ved
> StringBuffer!! Jeg prøver bare at forstå...
>

Prøv at de-compile noget kode der gør ovenstående..

/ Michael


Niels Teglsbo (31-01-2003)
Kommentar
Fra : Niels Teglsbo


Dato : 31-01-03 18:58

Jesper Lillesoe <jesper@FJERNveloce.dk> wrote:

> Skriver man "unknown" bliver den vel på compile-time puttet i en
> litteral-pool og gør derfor ingen skade. Og new String(et eller andet)
> kan jo garbage-collectes?

Men man spilder bare en masse tid i garbage-collectoren som man lige så
godt kunne hare sparet.

--
Niels, The Offspring Mailinglist www.image.dk/~teglsbo

Martin Moller Peders~ (31-01-2003)
Kommentar
Fra : Martin Moller Peders~


Dato : 31-01-03 21:55

In <qhdl3v856dsh00jrnv2gdfrdmpgulsfm4u@news.image.dk> Niels@fabel.dk (Niels Teglsbo) writes:

>Jesper Lillesoe <jesper@FJERNveloce.dk> wrote:

>> Skriver man "unknown" bliver den vel på compile-time puttet i en
>> litteral-pool og gør derfor ingen skade. Og new String(et eller andet)
>> kan jo garbage-collectes?

>Men man spilder bare en masse tid i garbage-collectoren som man lige så
>godt kunne hare sparet.

En moderne java-compiler burde genere samme bytekode for disse
to saetninger:

1. String One="one";
2. String One=new string("one");

/Martin


Niels Teglsbo (01-02-2003)
Kommentar
Fra : Niels Teglsbo


Dato : 01-02-03 03:48

tusk@daimi.au.dk (Martin Moller Pedersen) wrote:

> En moderne java-compiler burde genere samme bytekode for disse
> to saetninger:
>
> 1. String One="one";
> 2. String One=new string("one");

Hverken SUNs javac eller IBMs jikes laver samme class-filer, og en
dekompilering af de 4 resulterende class-filer er nærmest identisk med
kildekoden, altså med henholdsvis uden og med brug af Strings
String-konstruktør.

--
Niels, The Offspring Mailinglist www.image.dk/~teglsbo

Michael Banzon (01-02-2003)
Kommentar
Fra : Michael Banzon


Dato : 01-02-03 12:50


"Niels Teglsbo" <Niels@fabel.dk> skrev i en meddelelse
news:00dm3vo26ocgnja20bkqkadb34b61b2re4@news.image.dk...
> Hverken SUNs javac eller IBMs jikes laver samme class-filer, og en

Nej, selvfølgelig ikke... Filerne indeholder vel noget info om compileren
samt tidspunkt, et id osv. (???)

/ Michael



Niels Teglsbo (01-02-2003)
Kommentar
Fra : Niels Teglsbo


Dato : 01-02-03 16:47

"Michael Banzon" <anyone@anywhere.anyhow> wrote:

> "Niels Teglsbo" <Niels@fabel.dk> skrev i en meddelelse
> news:00dm3vo26ocgnja20bkqkadb34b61b2re4@news.image.dk...
> > Hverken SUNs javac eller IBMs jikes laver samme class-filer, og en
> Nej, selvfølgelig ikke... Filerne indeholder vel noget info om compileren
> samt tidspunkt, et id osv. (???)

Muligvis, men dekompileringen viste, at forskellen også var måden strengen
blev lavet på.

Oprindelig kode:

class String1 {
   public static void main(String args[]){
      String One="one";
      System.out.println(One);
   }
}

class String2 {
   public static void main(String args[]){
      String One=new String("one");
      System.out.println(One);
   }
}

Oversat til class-filer, der så er dekompileret:

----------- String1.class ---------

import java.io.PrintStream;

class String1 {
   
   
   public static void main(String args[]) {
      String s = "one";
      System.out.println(s);
   }
}

----------- String2.class ---------

import java.io.PrintStream;

class String2 {
   
   
   public static void main(String args[]) {
      String s = new String("one");
      System.out.println(s);
   }
}

-----------------------------------

Er der nogen, der ved hvorfor "import java.io.PrintStream;" er med? Man kan
også se "java/io/PrintStream;" i class-filen.

--
Niels, The Offspring Mailinglist www.image.dk/~teglsbo

Michael Banzon (01-02-2003)
Kommentar
Fra : Michael Banzon


Dato : 01-02-03 17:12

"Niels Teglsbo" <Niels@fabel.dk> skrev i en meddelelse
news:77pn3v4dllcuhud8u5tahcq98aerhepjbj@news.image.dk...
> "Michael Banzon" <anyone@anywhere.anyhow> wrote:
>
> > "Niels Teglsbo" <Niels@fabel.dk> skrev i en meddelelse
> > news:00dm3vo26ocgnja20bkqkadb34b61b2re4@news.image.dk...
> > > Hverken SUNs javac eller IBMs jikes laver samme class-filer, og en
> > Nej, selvfølgelig ikke... Filerne indeholder vel noget info om
compileren
> > samt tidspunkt, et id osv. (???)
>
> Muligvis, men dekompileringen viste, at forskellen også var måden strengen
> blev lavet på.
>
> Oprindelig kode:
>
> class String1 {
> public static void main(String args[]){
> String One="one";
> System.out.println(One);
> }
> }
>
> class String2 {
> public static void main(String args[]){
> String One=new String("one");
> System.out.println(One);
> }
> }
>
> Oversat til class-filer, der så er dekompileret:
>
> ----------- String1.class ---------
>
> import java.io.PrintStream;
>
> class String1 {
>
>
> public static void main(String args[]) {
> String s = "one";
> System.out.println(s);
> }
> }
>
> ----------- String2.class ---------
>
> import java.io.PrintStream;
>
> class String2 {
>
>
> public static void main(String args[]) {
> String s = new String("one");
> System.out.println(s);
> }
> }
>

Hvilken compiler+decompiler bruger du??

/ Michael



Niels Teglsbo (01-02-2003)
Kommentar
Fra : Niels Teglsbo


Dato : 01-02-03 20:20

"Michael Banzon" <anyone@anywhere.anyhow> wrote:

> Hvilken compiler+decompiler bruger du??

Jikes 1.17 og Decafe Pro 3.9. Samme resultat med Suns javac, der følger med
Java SDK 1.4 både med og uden -O.

--
Niels, The Offspring Mailinglist www.image.dk/~teglsbo

Anders K. Olsen (01-02-2003)
Kommentar
Fra : Anders K. Olsen


Dato : 01-02-03 21:55

"Martin Moller Pedersen" <tusk@daimi.au.dk> skrev i en meddelelse
news:b1enqd$mok$1@news.net.uni-c.dk...
> En moderne java-compiler burde genere samme bytekode for disse
> to saetninger:
>
> 1. String One="one";
> 2. String One=new string("one");

Bytecode er en ting, en anden ting er en ordentlig JIT compiler i den
virtuelle maskine. Den skal nok sørge for at optimere den ekstra objekt
allokering væk når programmet køres.

/Anders



Niels Teglsbo (01-02-2003)
Kommentar
Fra : Niels Teglsbo


Dato : 01-02-03 23:50

"Anders K. Olsen" <akol_dk@hotmail.com> wrote:

> "Martin Moller Pedersen" <tusk@daimi.au.dk> skrev i en meddelelse
> news:b1enqd$mok$1@news.net.uni-c.dk...
> > 1. String One="one";
> > 2. String One=new string("one");
> Bytecode er en ting, en anden ting er en ordentlig JIT compiler i den
> virtuelle maskine. Den skal nok sørge for at optimere den ekstra objekt
> allokering væk når programmet køres.

Jeg bruger

java version "1.4.0"
Java(TM) 2 Runtime Environment, Standard Edition (build 1.4.0-b92)
Java HotSpot(TM) Client VM (build 1.4.0-b92, mixed mode)

og har oversat:

------------------------------
class Ekstraobjekt {
private static long iterationer = 100*1000000;

private static void udenEkstraObjekt(){
for(long i=0; i<iterationer; i++){
String s = " davs ";
}
}

private static void medEkstraObjekt(){
for(long i=0; i<iterationer; i++){
String s = new String(" davs ");
}
}

public static void main(String args[]){
long start = System.currentTimeMillis();
udenEkstraObjekt();
long slut = System.currentTimeMillis();
System.out.println("Uden ekstra objekt tog det: "+(slut-start)+
" millisekunder");

start = System.currentTimeMillis();
medEkstraObjekt();
slut = System.currentTimeMillis();
System.out.println("Med ekstra objekt tog det: "+(slut-start)+
" millisekunder");

}
}
------------------------------
> javac -O Ekstraobjekt.java

> java Ekstraobjekt
Uden ekstra objekt tog det: 3020 millisekunder
Med ekstra objekt tog det: 23070 millisekunder

> java Ekstraobjekt
Uden ekstra objekt tog det: 3030 millisekunder
Med ekstra objekt tog det: 22900 millisekunder


Det er selvfølgelig en meget tænkt test, men den funktion med det ekstra
objekt bruger klart mere tid end den uden. Udover det burde oversætteren da
kunne se, at s i begge funktioner ikke bruges til noget, og kunne helt have
været udeladt, så for-løkkerne ville være tomme og dermed også begge
funktioner. JIT har vel også en mulighed for at lave samme slags
optimering.

--
Niels, The Offspring Mailinglist www.image.dk/~teglsbo

Anders K. Olsen (02-02-2003)
Kommentar
Fra : Anders K. Olsen


Dato : 02-02-03 00:38

"Niels Teglsbo" <Niels@fabel.dk> skrev i en meddelelse
news:dejo3v88le3or0fgrcermtidldl8art1ie@news.image.dk...

> Det er selvfølgelig en meget tænkt test, men den funktion med det ekstra
> objekt bruger klart mere tid end den uden. Udover det burde oversætteren
da
> kunne se, at s i begge funktioner ikke bruges til noget, og kunne helt
have
> været udeladt, så for-løkkerne ville være tomme og dermed også begge
> funktioner. JIT har vel også en mulighed for at lave samme slags
> optimering.

Jeg har kikket lidt på String klassen og String literals, og jeg kan se, at
jeg tog fejl.

Jeg havde regnet med, at nedenstående ville skrive true ud 4 gange, da de
tre strenge jo bygger på samme String literal, men det gør det ikke (og det
skal det heller ikke):

String a = "dav";
String b = "dav";
String c = new String("dav");
System.out.println(a==b);
System.out.println(a.equals(b));
System.out.println(a==c);
System.out.println(a.equals(c));

Resultatet er:
true
true
false
true

I følge JavaDoc, vil "new String(original)" initialisere en ny String som
representerer den samme sekvens af karakterer som original, altså en kopi af
original. Denne kopiering kan compileren åbenbart ikke optimere væk, selvom
strengen ikke bruges til noget.

/Anders



Thorbjoern Ravn Ande~ (02-02-2003)
Kommentar
Fra : Thorbjoern Ravn Ande~


Dato : 02-02-03 10:02

Niels@fabel.dk (Niels Teglsbo) writes:

> Det er selvfølgelig en meget tænkt test, men den funktion med det ekstra
> objekt bruger klart mere tid end den uden. Udover det burde oversætteren da

Meget interessant, da det meget tydeligt anskueliggør at "new" ikke er
en gratis operation.

> kunne se, at s i begge funktioner ikke bruges til noget, og kunne helt have
> været udeladt, så for-løkkerne ville være tomme og dermed også begge
> funktioner. JIT har vel også en mulighed for at lave samme slags
> optimering.

Det afhænger vel af om String-constructoren har sideeffekter. Det kan
JIT'en vel ikke regne ud.
--
Thorbjørn Ravn Andersen
http://unixsnedkeren.dk/ravn

Michael Berg (08-02-2003)
Kommentar
Fra : Michael Berg


Dato : 08-02-03 20:35

Hej Martin!

> En moderne java-compiler burde genere samme bytekode for disse
> to saetninger:
>
> 1. String One="one";
> 2. String One=new string("one");
>

Hm. Kan den nu også tillade sig det?

Det gælder vel kun hvis der antages at jeg ikke selv har lavet en klasse ved navn String (måske ligger den endda i en Import) og at der på runtime tidspunktet ikke findes en klasse i classpath ved navn String. Er det sikkert at opstille sådanne forudsætninger?

Mvh Michael


Ulrik Magnusson (09-02-2003)
Kommentar
Fra : Ulrik Magnusson


Dato : 09-02-03 10:44



Michael Berg wrote:

> Hej Martin!
>
> > En moderne java-compiler burde genere samme bytekode for disse
> > to saetninger:
> >
> > 1. String One="one";
> > 2. String One=new string("one");
> >
>
> Hm. Kan den nu også tillade sig det?
>
> Det gælder vel kun hvis der antages at jeg ikke selv har lavet en klasse ved navn String (måske ligger den endda i en Import) og at der på runtime tidspunktet ikke findes en klasse i classpath ved navn String.

Så skulle compileren gerne blive forvirret og opgive.

> Er det sikkert at opstille sådanne forudsætninger?

Ja, for java.lang.String burde det være - ikke for andre.

Ulrik Magnusson


Ulrik Magnusson (09-02-2003)
Kommentar
Fra : Ulrik Magnusson


Dato : 09-02-03 11:13



Ulrik Magnusson wrote:

> Michael Berg wrote:
> > Hej Martin!
> > > En moderne java-compiler burde genere samme bytekode for disse
> > > to saetninger:
> > > 1. String One="one";
> > > 2. String One=new string("one");
> > Hm. Kan den nu også tillade sig det?
> > Det gælder vel kun hvis der antages at jeg ikke selv har lavet en klasse ved navn String (måske ligger den endda i en Import) og at der på runtime tidspunktet ikke findes en klasse i classpath ved navn String.
> Så skulle compileren gerne blive forvirret og opgive.

Heh, jeg misforstod vist lidt- jeg går ud fra at alle compilere er
pålagt altid at have en java.lang.String, og eftersom "one" har
typen java.lang.String kan du ikke tildele denne til variabler
af typen mypackage.String. Mere korrekt var det nok at sige
at følgende burde generere samme bytecode:

java.lang.String s = "";
java.lang.String s = new java.lang.String("");

- hvis du har en mypackage.String i import er du
tvunget til at bruge det fulde navn java.lang.String,

Ulrik Magnusson


Finn Nielsen (09-02-2003)
Kommentar
Fra : Finn Nielsen


Dato : 09-02-03 12:04

Ulrik Magnusson <ulrikm@yahoo.com> writes:

> Heh, jeg misforstod vist lidt- jeg går ud fra at alle compilere er
> pålagt altid at have en java.lang.String, og eftersom "one" har
> typen java.lang.String kan du ikke tildele denne til variabler
> af typen mypackage.String. Mere korrekt var det nok at sige
> at følgende burde generere samme bytecode:
>
> java.lang.String s = "";
> java.lang.String s = new java.lang.String("");

Næh..

Forestil dig at du har en metode der sammenligner to strenge med ==
(altså om det er det samme objekt, ikke om det er samme indhold) og hvis
det er den samme gøres en ting, hvis det ikke er så gøres noget andet.

Du instantierer nu to strenge a og b:

String a = "ting";
String b = new String("ting");

og kalder ovennævnte metode med dem som parametre.

"Optimerer" man initialiseringen af b så vil det ændre på programmets
opførsel, ikke særligt fedt! Compileren må kun lave optimeringer der ikke
kan ændre på programmets opførsel, b skal altså være et andet objekt end
a ligesom java-standarden foreskriver det.




java.lang.String s = "";
java.lang.String s = new java.lang.String("");

bør ALDRIG genere samme bytecode.

--
Finn Nielsen - http://www.finnnielsen.dk/

Ulrik Magnusson (09-02-2003)
Kommentar
Fra : Ulrik Magnusson


Dato : 09-02-03 12:28



Finn Nielsen wrote:

> Ulrik Magnusson <ulrikm@yahoo.com> writes:
>
> > Heh, jeg misforstod vist lidt- jeg går ud fra at alle compilere er
> > pålagt altid at have en java.lang.String, og eftersom "one" har
> > typen java.lang.String kan du ikke tildele denne til variabler
> > af typen mypackage.String. Mere korrekt var det nok at sige
> > at følgende burde generere samme bytecode:
> >
> > java.lang.String s = "";
> > java.lang.String s = new java.lang.String("");
>
> Næh..
>
> Forestil dig at du har en metode der sammenligner to strenge med ==
> (altså om det er det samme objekt, ikke om det er samme indhold) og hvis
> det er den samme gøres en ting, hvis det ikke er så gøres noget andet.
>
> Du instantierer nu to strenge a og b:
>
> String a = "ting";
> String b = new String("ting");
>
> og kalder ovennævnte metode med dem som parametre.
>
> "Optimerer" man initialiseringen af b så vil det ændre på programmets
> opførsel, ikke særligt fedt! Compileren må kun lave optimeringer der ikke
> kan ændre på programmets opførsel, b skal altså være et andet objekt end
> a ligesom java-standarden foreskriver det.

Det har du minsandten ret i - "" tages som en konstant og new String("")
kopierer dennes indhold. Man lærer noget hver dag

Ulrik Magnusson


Søg
Reklame
Statistik
Spørgsmål : 177558
Tips : 31968
Nyheder : 719565
Indlæg : 6408925
Brugere : 218888

Månedens bedste
Årets bedste
Sidste års bedste