Confronto di Stringhe in Java
Scorri per mostrare il menu
Il confronto è il punto in cui Java inizia a comportarsi in modo un po' più "a basso livello" del previsto. Sembra ovvio che le stringhe possano essere confrontate allo stesso modo dei numeri — usando ==. Dopotutto, se due stringhe sembrano identiche, perché non dovrebbero essere uguali?
Il problema con ==
Se si utilizza == con i letterali di stringa, inizialmente sembra funzionare correttamente:
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); } }
Entrambe le variabili puntano allo stesso oggetto nel string pool interno di Java — quando lo stesso letterale appare di nuovo, Java riutilizza quello esistente. Quindi == restituisce true.
Ma ora cambiamo leggermente il modo in cui vengono create le stringhe:
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); } }
Utilizzando new String() si indica a Java di creare ogni volta un oggetto completamente separato — anche se il contenuto è identico. Poiché == confronta gli indirizzi di memoria, non il testo, restituisce false.
Regola fondamentale: == non guarda il testo all'interno della stringa — controlla se entrambe le variabili puntano esattamente allo stesso oggetto in memoria.
equals() — Confronto del Contenuto Effettivo
Se è necessario confrontare il testo effettivo all'interno di due stringhe, utilizzare .equals(). Ignora completamente la memoria e si concentra solo sui caratteri:
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)); } }
Anche se order1 e order2 sono oggetti separati in memoria, .equals() confronta il loro contenuto e restituisce true.
Sensibilità alle maiuscole e minuscole con equals()
Java distingue tra maiuscole e minuscole, quindi anche una sola lettera con una diversa capitalizzazione rende le stringhe diverse:
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" e "latte" sono considerate stringhe diverse, quindi il risultato è false.
equalsIgnoreCase() — Confronto senza distinzione tra maiuscole e minuscole
Per confrontare stringhe ignorando le differenze tra maiuscole e minuscole, utilizzare .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() considera "Latte" e "LATTE" identici e restituisce true.
Grazie per i tuoi commenti!
Chieda ad AI
Chieda ad AI
Chieda pure quello che desidera o provi una delle domande suggerite per iniziare la nostra conversazione
Confronto di Stringhe in Java
Il confronto è il punto in cui Java inizia a comportarsi in modo un po' più "a basso livello" del previsto. Sembra ovvio che le stringhe possano essere confrontate allo stesso modo dei numeri — usando ==. Dopotutto, se due stringhe sembrano identiche, perché non dovrebbero essere uguali?
Il problema con ==
Se si utilizza == con i letterali di stringa, inizialmente sembra funzionare correttamente:
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); } }
Entrambe le variabili puntano allo stesso oggetto nel string pool interno di Java — quando lo stesso letterale appare di nuovo, Java riutilizza quello esistente. Quindi == restituisce true.
Ma ora cambiamo leggermente il modo in cui vengono create le stringhe:
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); } }
Utilizzando new String() si indica a Java di creare ogni volta un oggetto completamente separato — anche se il contenuto è identico. Poiché == confronta gli indirizzi di memoria, non il testo, restituisce false.
Regola fondamentale: == non guarda il testo all'interno della stringa — controlla se entrambe le variabili puntano esattamente allo stesso oggetto in memoria.
equals() — Confronto del Contenuto Effettivo
Se è necessario confrontare il testo effettivo all'interno di due stringhe, utilizzare .equals(). Ignora completamente la memoria e si concentra solo sui caratteri:
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)); } }
Anche se order1 e order2 sono oggetti separati in memoria, .equals() confronta il loro contenuto e restituisce true.
Sensibilità alle maiuscole e minuscole con equals()
Java distingue tra maiuscole e minuscole, quindi anche una sola lettera con una diversa capitalizzazione rende le stringhe diverse:
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" e "latte" sono considerate stringhe diverse, quindi il risultato è false.
equalsIgnoreCase() — Confronto senza distinzione tra maiuscole e minuscole
Per confrontare stringhe ignorando le differenze tra maiuscole e minuscole, utilizzare .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() considera "Latte" e "LATTE" identici e restituisce true.
Grazie per i tuoi commenti!