Java Academy · Lektion

Hvorfor strings er immutable

Forstå strings' uforanderlighed

Lektion 1 af 413 trin

Hvorfor strings er immutable er en gratis Java Academy-lektion på CoddyKit. Dette er lektion 1 af 4. Du kan læse hele lektionen gratis nedenfor — og derefter øve dig praktisk i browseren med en indbygget kodeeditor og en AI-vejleder, der er tilgængelig døgnet rundt. Den er en del af læringsforløbet i Java Academy, og dine fremskridt synkroniseres på tværs af nettet og CoddyKit-appen. Java Academy-kurset indeholder 4 lektioner i alt.

Strenge kan ikke ændres

I Java er en String uforanderlig: Når den først er oprettet, kan dens tegn aldrig ændres. Enhver metode, der ser ud til at ændre en streng, returnerer faktisk en helt ny streng.

Metoder returnerer nye strenge

toUpperCase(), replace() og lignende ændrer ikke den oprindelige streng. De opretter en ny String og lader den oprindelige være urørt.

public class Main {
    public static void main(String[] args) {
        String original = "hello";
        String upper = original.toUpperCase();
        System.out.println("original: " + original);
        System.out.println("upper: " + upper);
    }
}

Gentildeling er ikke ændring

Når du skriver s = s + "!", peger variablen nu på en ny streng. Det gamle strengobjekt er uændret og kan blive fjernet af affaldsopsamleren.

public class Main {
    public static void main(String[] args) {
        String s = "hi";
        String firstRef = s;
        s = s + "!";
        System.out.println("s: " + s);
        System.out.println("firstRef: " + firstRef);
    }
}

Hvorfor uforanderlighed?

Uforanderlighed giver reelle fordele:

  • Trådsikkerhed: strenge kan deles uden låse
  • Cachelagring: hashkoder og poster i puljen forbliver gyldige
  • Sikkerhed: en streng, der gives til en metode, kan ikke ændres ubemærket

String-puljen

Identiske strengliteraler kan dele ét objekt i String-puljen. Det er kun sikkert, fordi strenge aldrig ændres. Her henviser to literaler til det samme objekt i puljen.

public class Main {
    public static void main(String[] args) {
        String a = "java";
        String b = "java";
        System.out.println(a == b);
        System.out.println(a.equals(b));
    }
}

new String omgår puljedeling

Brug af new String(...) tvinger et separat objekt frem, så referenceligheden er forskellig, selv om indholdet er ens. Sammenlign altid indholdet med equals.

public class Main {
    public static void main(String[] args) {
        String a = "java";
        String b = new String("java");
        System.out.println("== : " + (a == b));
        System.out.println("equals: " + a.equals(b));
    }
}

Omkostningen ved sammenkædning

Hvert + på strenge opretter et nyt objekt. Hvis du gør det i en løkke, oprettes mange kortlivede strenge, hvilket spilder tid og hukommelse.

public class Main {
    public static void main(String[] args) {
        String result = "";
        for (int i = 1; i <= 5; i++) {
            result = result + i;
        }
        System.out.println(result);
    }
}

Kvadratisk vækst

Fordi hver sammenkædning kopierer alle tidligere tegn, skalerer det dårligt at opbygge en lang streng med + i en løkke, omtrent som O(n²). Det er det grundlæggende ydelsesproblem.

public class Main {
    public static void main(String[] args) {
        String s = "";
        for (int i = 0; i < 1000; i++) {
            s += "x";
        }
        System.out.println("Length: " + s.length());
    }
}

Uforanderlige værdier er forudsigelige

Det er sikkert at give en streng til en metode: Metoden kan ikke ændre din kopi. Her opbygger metoden en ny streng, mens kalderens værdi forbliver intakt.

public class Main {
    static void shout(String s) {
        s = s + "!!!";
        System.out.println("inside: " + s);
    }
    public static void main(String[] args) {
        String msg = "hello";
        shout(msg);
        System.out.println("outside: " + msg);
    }
}

Et smugkig på løsningen

Når du skal opbygge strenge effektivt, tilbyder Java StringBuilder, en foranderlig ledsagerklasse. Den ændrer teksten direkte i stedet for at oprette nye objekter hver gang.

public class Main {
    public static void main(String[] args) {
        StringBuilder sb = new StringBuilder();
        for (int i = 1; i <= 5; i++) {
            sb.append(i);
        }
        System.out.println(sb.toString());
    }
}

Sammenligning af de to tilgange

Ved nogle få sammenkædninger er + helt fint og læsbart. Ved mange sammenkædninger i en løkke bør du foretrække StringBuilder. Vælg ud fra, hvor meget du skal opbygge.

public class Main {
    public static void main(String[] args) {
        String simple = "a" + "b" + "c";
        StringBuilder sb = new StringBuilder("a");
        sb.append("b").append("c");
        System.out.println(simple);
        System.out.println(sb);
    }
}

Hurtigt tjek

Hvad sker der faktisk, når du kalder s.toUpperCase() på en String?

Opsummering

Du har lært, hvorfor strenge er uforanderlige:

  • Indholdet i en String ændres aldrig
  • Metoder returnerer nye strenge
  • Uforanderlighed muliggør trådsikkerhed, puljedeling og sikkerhed
  • Sammenkædning med + i løkker skalerer dårligt
  • StringBuilder er den foranderlige løsning
Gratis at komme i gang

Lær Java med en AI-underviser — gratis

Skriv og kør rigtig kode i din browser, få øjeblikkelig hjælp fra en AI-underviser døgnet rundt, og fortsæt, hvor du slap, på web eller i appen.

Kurser
104
Lektioner
374

Ofte stillede spørgsmål

Er lektionen “Hvorfor strings er immutable” gratis?

Ja — hele teksten til “Hvorfor strings er immutable” kan læses gratis her på nettet. Hvis du vil øve dig interaktivt med en indbygget kodeeditor og en AI-vejleder døgnet rundt og få adgang til resten af Java Academy-kurset, skal du opgradere til CoddyKit PRO. Java Academy-kurset indeholder 4 lektioner i alt.

Hvad lærer jeg i “Hvorfor strings er immutable”?

Forstå strings' uforanderlighed Du øver dig i Java Academy med praktisk kode, som du kører direkte i browseren, og en AI-vejleder døgnet rundt besvarer dine spørgsmål, mens du arbejder dig gennem lektionen.

Skal jeg have erfaring for at begynde på Java Academy?

Der kræves ingen tidligere erfaring. Java Academy på CoddyKit er tilrettelagt for både begyndere og øvede, så du kan starte her eller fra begyndelsen og lære i dit eget tempo. Dette er lektion 1 af 4.

Hvor lang tid tager lektionen “Hvorfor strings er immutable”?

De fleste CoddyKit-lektioner tager cirka 5–10 minutter. Hver lektion er kort og interaktiv, så du gør løbende fremskridt og kan fortsætte, hvor du slap – på både web og app.

Kan jeg skrive og køre kode i denne Java Academy-lektion?

Ja. Alle Java Academy-lektioner har en indbygget kodeeditor, så du kan skrive og køre rigtig kode direkte i din browser og få øjeblikkelig feedback fra AI – uden lokal opsætning.

Alle lektioner i dette kursus

  1. Hvorfor strings er immutable
  2. Byg strings med StringBuilder
  3. StringBuilder-metoder
  4. StringBuilder kontra StringBuffer
← Tilbage til Java Academy