Hvorfor strings er immutable
Forstå strings' uforanderlighed
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 StringBuilderer den foranderlige løsning
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
- Hvorfor strings er immutable
- Byg strings med StringBuilder
- StringBuilder-metoder
- StringBuilder kontra StringBuffer