On Thu, 20 Mar 2003 16:07:55 +0100, Janus Engstr0m wrote:
> Den var god *g*. Well, så vidt jeg husker fra en tidligere diskussion
> omkring dette emne, er der forskel på at bruge eller ikke bruge new ved
> String. Bytecoden var (så vidt jeg husker) længere ved brugen af new.
> Men det afhænger selvfølgelig af compileren, og hvilken der var brugt i
> dette tilfælde kan jeg ikke huske, det er også over 1 år siden.
Du har ganske ret. Et lille eksempel (med brug af javac fra version
1.4.1_01-linux. Det gav ingen forskel med optimering -O slået til/fra ):
public class TestNewString {
public void withoutNew() {
String t1 = "Hej Med Dig";
}
public void withNew() {
String t2 = new String("Ny streng");
}
}
bliver til (med kommentarer)
Compiled from TestNewString.java
....
Method void withoutNew()
0 ldc #2 <String "Hej Med Dig"> // Push det andet element fra
// runtime constant pool på stakken
2 astore_1 // Gem det som ligger på stakken som
// lokal variabel 1 i den aktuelle frame
3 return
Method void withNew()
0 new #3 <Class java.lang.String> // Opret en ny reference til en
// String på toppen af stakken
3 dup // Dupliker toppen
4 ldc #4 <String "Ny streng"> // Push det fjerde element fra
// runtime constant pool på stakken
6 invokespecial #5 <Method java.lang.String(java.lang.String)>
// Kald konstruktøren for næstøverste element på stakken
// (en ref til en String) med det argument,
// der ligger øverst på stakken
9 astore_1
10 return
For den nysgerrige kan The Java Virtual Machine Specification findes på
http://java.sun.com/docs/books/vmspec/
Denne bog indeholder bl.a. en oversigt over de forskellige byte code
instruktioner.
--
Mikkel Bundgaard
Student at IT University of Copenhagen
Codito, Ergo Sum