Sammenligning af Strenge i Java
Stryg for at vise menuen
Sammenligning er der, hvor Java begynder at opføre sig en smule mere "lav-niveau" end forventet. Det virker oplagt, at strenge kunne sammenlignes på samme måde som tal — ved at bruge ==. Når alt kommer til alt, hvis to strenge ser identiske ud, hvorfor skulle de så ikke være ens?
Problemet med ==
Hvis du bruger == med streng-litteraler, ser det ud til at fungere fint i starten:
Main.java
1234567891011package com.example; public class Main { public static void main(String[] args) { String order1 = "Latte"; String order2 = "Latte"; System.out.println(order1 == order2); } }
Begge variabler peger på det samme objekt i Javas interne string pool — når den samme literal optræder igen, genbruger Java den eksisterende. Derfor returnerer == true.
Men lad os nu ændre lidt på, hvordan strengene oprettes:
Main.java
1234567891011package com.example; public class Main { public static void main(String[] args) { String order1 = new String("Latte"); String order2 = new String("Latte"); System.out.println(order1 == order2); } }
Ved at bruge new String() instruerer man Java i at oprette et helt separat objekt hver gang — selvom indholdet er identisk. Da == sammenligner hukommelsesadresser og ikke tekst, returnerer det false.
Den vigtigste regel: == ser ikke på teksten inde i strengen — det kontrollerer, om begge variabler peger på præcis det samme objekt i hukommelsen.
equals() — Sammenligning af faktisk indhold
Hvis du skal sammenligne den faktiske tekst i to strenge, skal du bruge .equals(). Den ignorerer hukommelsen fuldstændigt og fokuserer kun på tegnene:
Main.java
1234567891011package com.example; public class Main { public static void main(String[] args) { String order1 = new String("Latte"); String order2 = new String("Latte"); System.out.println(order1.equals(order2)); } }
Selvom order1 og order2 er separate objekter i hukommelsen, sammenligner .equals() deres indhold og returnerer true.
Storefølsomhed med equals()
Java er storefølsomt, så selv én bogstavforskel i store og små bogstaver gør strengene forskellige:
Main.java
1234567891011package com.example; public class Main { public static void main(String[] args) { String order1 = "Latte"; String order2 = "latte"; System.out.println(order1.equals(order2)); } }
"Latte" og "latte" behandles som forskellige strenge, så resultatet er false.
equalsIgnoreCase() — Sammenligning uden hensyn til store og små bogstaver
Hvis du skal sammenligne strenge, men vil ignorere forskelle mellem store og små bogstaver, skal du bruge .equalsIgnoreCase():
Main.java
12345678910package com.example; public class Main { public static void main(String[] args) { String order = "Latte"; System.out.println(order.equalsIgnoreCase("LATTE")); } }
.equalsIgnoreCase() behandler "Latte" og "LATTE" som identiske og returnerer true.
Tak for dine kommentarer!
Spørg AI
Spørg AI
Spørg om hvad som helst eller prøv et af de foreslåede spørgsmål for at starte vores chat