Hvorfor strenger er uforanderlige
Forstå at strenger er uforanderlige
Hvorfor strenger er uforanderlige er en gratis leksjon i Java Academy på CoddyKit. Dette er leksjon 1 av 4. Du kan lese hele leksjonen gratis nedenfor – og deretter øve praktisk i nettleseren med en innebygd kodeeditor og en AI-veileder som er tilgjengelig døgnet rundt. Den er en del av læringsløpet i Java Academy, og fremdriften din synkroniseres mellom nettet og CoddyKit-appen. Kurset i Java Academy inneholder totalt 4 leksjoner.
Strenger kan ikke endres
I Java er en String uforanderlig: Når den først er opprettet, kan tegnene aldri endres. Alle metoder som ser ut til å endre en streng, returnerer faktisk en helt ny streng.
Metoder returnerer nye strenger
toUpperCase(), replace() og lignende endrer ikke originalen. De lager en ny String og lar originalen 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);
}
}Ny tilordning er ikke en mutasjon
Når du skriver s = s + "!", peker variabelen nå på en ny streng. Det gamle strengobjektet er uendret og kan bli samlet inn av søppelryddingen.
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 uforanderlighet?
Uforanderlighet gir reelle fordeler:
- Trådsikkerhet: strenger kan deles uten låser
- Caching: hashkoder og oppføringer i poolen forblir gyldige
- Sikkerhet: en streng som sendes til en metode, kan ikke endres uten at du merker det
String-poolen
Identiske strengliteraler kan dele ett objekt i string pool. Dette er bare trygt fordi strenger aldri endres. Her viser to litteraler til det samme objektet i poolen.
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 bryter pooling
Bruk av new String(...) tvinger frem et separat objekt, så referanselikheten blir forskjellig selv om innholdet er likt. Sammenlign alltid innhold 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));
}
}Kostnaden ved konkatenering
Hver +-operator på strenger oppretter et nytt objekt. Hvis du gjør dette i en løkke, opprettes mange kortlevde strenger, noe som sløser med tid og minne.
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 vekst
Fordi hver konkatenering kopierer alle tidligere tegn, skalerer det dårlig å bygge en lang streng med + i en løkke (omtrent O(n²)). Dette er det grunnleggende ytelsesproblemet.
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 verdier er forutsigbare
Det er trygt å sende en streng til en metode: Metoden kan ikke endre din kopi. Her bygger metoden en ny streng, mens verdien hos den kallende koden forblir 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);
}
}Løsningen i korte trekk
Når du trenger å bygge strenger effektivt, tilbyr Java StringBuilder, en foranderlig hjelpeklasse. Den endrer innholdet direkte i stedet for å opprette 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 av de to metodene
For noen få konkateneringer er + helt greit og lett å lese. For mange konkateneringer i en løkke bør du foretrekke StringBuilder. Velg ut fra hvor mye tekst du bygger.
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);
}
}Hurtigsjekk
Hva skjer egentlig når du kaller s.toUpperCase() på en String?
Oppsummering
Du har lært hvorfor strenger er uforanderlige:
- Innholdet i en
Stringendres aldri - Metoder returnerer nye strenger
- Uforanderlighet muliggjør trådsikkerhet, pooling og sikkerhet
- Konkatenering med
+i løkker skalerer dårlig StringBuilderer den foranderlige løsningen
Lær deg Java med en AI-veileder – gratis
Skriv og kjør ekte kode i nettleseren, få umiddelbar hjelp fra en AI-veileder som er tilgjengelig døgnet rundt, og fortsett der du slapp – på nettet eller i appen.
- Kurs
- 104
- Leksjoner
- 374
Ofte stilte spørsmål
Er leksjonen «Hvorfor strenger er uforanderlige» gratis?
Ja – hele teksten i «Hvorfor strenger er uforanderlige» er gratis å lese her på nettet. For å øve interaktivt med en innebygd kodeeditor og en AI-veileder som er tilgjengelig døgnet rundt, og for å låse opp resten av Java Academy-kurset, kan du oppgradere til CoddyKit PRO. Kurset i Java Academy inneholder totalt 4 leksjoner.
Hva lærer jeg i «Hvorfor strenger er uforanderlige»?
Forstå at strenger er uforanderlige Du øver på Java Academy med praktisk kode som du kjører direkte i nettleseren, mens en AI-veileder som er tilgjengelig døgnet rundt, svarer på spørsmålene dine mens du jobber deg gjennom leksjonen.
Trenger jeg erfaring for å begynne med Java Academy?
Ingen tidligere erfaring er nødvendig. Java Academy på CoddyKit er lagt opp for både nybegynnere og viderekomne, så De kan begynne her eller helt fra start og lære i Deres eget tempo. Dette er leksjon 1 av 4.
Hvor lang tid tar leksjonen «Hvorfor strenger er uforanderlige»?
De fleste CoddyKit-leksjoner tar omtrent 5–10 minutter. Hver leksjon er kort og interaktiv, slik at De gjør jevne fremskritt og kan fortsette akkurat der De slapp – både på nettet og i appen.
Kan jeg skrive og kjøre kode i denne Java Academy-leksjonen?
Ja. Alle Java Academy-leksjoner har en innebygd kodeeditor, slik at De kan skrive og kjøre ekte kode direkte i nettleseren og få umiddelbar tilbakemelding fra AI – uten lokal konfigurering.
Alle leksjonene i dette kurset
- Hvorfor strenger er uforanderlige
- Bygge strenger med StringBuilder
- StringBuilder-metoder
- StringBuilder kontra StringBuffer