Jämföra strängar i Java
Svep för att visa menyn
Jämförelse är där Java börjar bete sig lite mer "lågnivå" än förväntat. Det känns självklart att strängar skulle kunna jämföras på samma sätt som tal — med ==. Om två strängar ser identiska ut, varför skulle de då inte vara lika?
Problemet med ==
Om du använder == med strängliteraler verkar det fungera bra till en början:
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); } }
Båda variablerna pekar på samma objekt i Javas interna strängpool — när samma literal förekommer igen återanvänder Java det befintliga objektet. Därför returnerar == värdet true.
Men nu ändrar vi lite på hur strängarna skapas:
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); } }
Att använda new String() instruerar Java att skapa ett helt separat objekt varje gång — även om innehållet är identiskt. Eftersom == jämför minnesadresser, inte text, returnerar det false.
Den viktiga regeln: == tittar inte på texten inuti strängen — det kontrollerar om båda variablerna pekar på exakt samma objekt i minnet.
equals() — Jämföra faktiskt innehåll
Om du behöver jämföra den faktiska texten i två strängar, använd .equals(). Den ignorerar minnet helt och fokuserar endast på tecknen:
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)); } }
Även om order1 och order2 är separata objekt i minnet, jämför .equals() deras innehåll och returnerar true.
Skiftlägeskänslighet med equals()
Java är skiftlägeskänsligt, så även en bokstavs skillnad i versaler/gemener gör strängar olika:
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" och "latte" behandlas som olika strängar, så resultatet blir false.
equalsIgnoreCase() — Jämförelse utan att bry sig om skiftläge
För att jämföra strängar utan att ta hänsyn till skillnader mellan versaler och gemener, använd .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() behandlar "Latte" och "LATTE" som identiska och returnerar true.
Tack för dina kommentarer!
Fråga AI
Fråga AI
Fråga vad du vill eller prova någon av de föreslagna frågorna för att starta vårt samtal
Jämföra strängar i Java
Jämförelse är där Java börjar bete sig lite mer "lågnivå" än förväntat. Det känns självklart att strängar skulle kunna jämföras på samma sätt som tal — med ==. Om två strängar ser identiska ut, varför skulle de då inte vara lika?
Problemet med ==
Om du använder == med strängliteraler verkar det fungera bra till en början:
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); } }
Båda variablerna pekar på samma objekt i Javas interna strängpool — när samma literal förekommer igen återanvänder Java det befintliga objektet. Därför returnerar == värdet true.
Men nu ändrar vi lite på hur strängarna skapas:
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); } }
Att använda new String() instruerar Java att skapa ett helt separat objekt varje gång — även om innehållet är identiskt. Eftersom == jämför minnesadresser, inte text, returnerar det false.
Den viktiga regeln: == tittar inte på texten inuti strängen — det kontrollerar om båda variablerna pekar på exakt samma objekt i minnet.
equals() — Jämföra faktiskt innehåll
Om du behöver jämföra den faktiska texten i två strängar, använd .equals(). Den ignorerar minnet helt och fokuserar endast på tecknen:
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)); } }
Även om order1 och order2 är separata objekt i minnet, jämför .equals() deras innehåll och returnerar true.
Skiftlägeskänslighet med equals()
Java är skiftlägeskänsligt, så även en bokstavs skillnad i versaler/gemener gör strängar olika:
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" och "latte" behandlas som olika strängar, så resultatet blir false.
equalsIgnoreCase() — Jämförelse utan att bry sig om skiftläge
För att jämföra strängar utan att ta hänsyn till skillnader mellan versaler och gemener, använd .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() behandlar "Latte" och "LATTE" som identiska och returnerar true.
Tack för dina kommentarer!