Metodi della Classe String in Java
Riferimento ai principali metodi Java String: length, charAt, substring, indexOf, replace, split, toUpperCase, trim e altri ancora.
La classe String include decine di metodi. Questo capitolo è un riferimento pratico di quelli che utilizzerai davvero, raggruppati per funzione: ispezione, confronto, ricerca, suddivisione, trasformazione, splitting/joining, conversione e formattazione.
Ricorda: le stringhe sono immutabili. Ogni metodo restituisce una nuova stringa (o un altro valore) — non modifica mai la stringa su cui viene chiamato. Ciò significa che una chiamata come s.toUpperCase(); da sola non è utile; devi catturare il risultato:
String s = "hello";
s.toUpperCase(); // result discarded — s is still "hello"
s = s.toUpperCase(); // s is now "HELLO"Gli indici sono a base zero e contano le unità di codice UTF-16, non i caratteri percepiti dall'utente, il che è rilevante per emoji e altri caratteri supplementari.
Ispezione di una stringa
| Metodo | Cosa restituisce |
|---|---|
length() | numero di unità di codice UTF-16 |
isEmpty() | true se la lunghezza è 0 |
isBlank() (Java 11+) | true se la lunghezza è 0 o contiene solo spazi bianchi |
charAt(int i) | il carattere all'indice i |
codePointAt(int i) | il code point Unicode all'indice i |
"hello".length(); // 5
"".isEmpty(); // true
" ".isBlank(); // true
"hello".charAt(1); // 'e'Confronto di stringhe
| Metodo | Cosa restituisce |
|---|---|
equals(other) | true se il contenuto è uguale |
equalsIgnoreCase(other) | uguaglianza senza distinzione tra maiuscole e minuscole |
compareTo(other) | ordinamento lessicografico negativo / 0 / positivo |
compareToIgnoreCase(other) | come sopra, senza distinzione tra maiuscole e minuscole |
"hi".equals("hi"); // true
"HI".equalsIgnoreCase("hi"); // true
"apple".compareTo("banana"); // negativePreferisci sempre .equals() a == per il confronto del contenuto (Operatori di Confronto). == confronta i riferimenti agli oggetti — se due variabili puntano allo stesso oggetto — non i caratteri al loro interno. Poiché Java interna i letterali stringa, == sembra funzionare a volte, ma fallisce nel momento in cui una stringa viene costruita a runtime:
String a = "hi";
String b = "hi";
String c = new String("hi");
a == b; // true — both point to the same interned literal
a == c; // false — c is a different object
a.equals(c); // true — same contentscompareTo è quello che ti serve per l'ordinamento: restituisce un numero negativo, zero o un numero positivo, quindi si integra direttamente in Collections.sort o nelle catene Comparator.
Ricerca
| Metodo | Cosa restituisce |
|---|---|
contains(seq) | true se seq appare in qualsiasi punto |
indexOf(seq) | primo indice dove inizia seq, o -1 |
indexOf(seq, fromIndex) | come sopra, partendo da fromIndex |
lastIndexOf(seq) | ultimo indice dove inizia seq, o -1 |
startsWith(prefix) | true se la stringa inizia con prefix |
endsWith(suffix) | true se la stringa termina con suffix |
String s = "abc-xyz-abc";
s.contains("xyz"); // true
s.indexOf("abc"); // 0
s.lastIndexOf("abc"); // 8
s.startsWith("abc"); // true
s.endsWith("xyz"); // falseSuddivisione
| Metodo | Cosa restituisce |
|---|---|
substring(start) | dalla posizione start fino alla fine |
substring(start, end) | da start (incluso) a end (escluso) |
String s = "Hello, World!";
s.substring(7); // "World!"
s.substring(7, 12); // "World"Gli indici negativi non sono consentiti — generano una StringIndexOutOfBoundsException.
Trasformazione
| Metodo | Cosa restituisce |
|---|---|
toUpperCase() | copia in maiuscolo |
toLowerCase() | copia in minuscolo |
trim() | copia senza spazi bianchi ASCII iniziali/finali |
strip() (Java 11+) | copia senza spazi bianchi Unicode iniziali/finali |
replace(old, new) | ogni corrispondenza letterale sostituita |
replaceAll(regex, replacement) | sostituzione basata su espressione regolare |
replaceFirst(regex, replacement) | espressione regolare, solo la prima corrispondenza |
repeat(n) (Java 11+) | la stringa ripetuta n volte |
concat(other) | identico a s + other |
" hello ".strip(); // "hello"
"banana".replace("a", "_"); // "b_n_n_"
"hello".repeat(3); // "hellohellohello"
"abc 123".replaceAll("\\d", "*"); // "abc ***"Splitting e joining
| Metodo | Cosa restituisce |
|---|---|
split(regex) | array di sottostringhe |
split(regex, limit) | come sopra, ma limitato a limit parti |
String.join(sep, parts...) | metodo statico — unisce con separatore |
chars() | IntStream di unità di codice UTF-16 |
lines() (Java 11+) | Stream<String> di righe |
"a,b,c".split(","); // ["a","b","c"]
String.join("-", "a", "b", "c"); // "a-b-c"
String.join(",", List.of("a","b")); // "a,b"
"line1\nline2\nline3".lines().count(); // 3split accetta un'espressione regolare, non una stringa semplice — quindi effettua l'escape dei metacaratteri regex: usa split("\\.") per dividere su un punto letterale, non split(".") (che corrisponde a ogni carattere e restituisce un array vuoto). Le stringhe vuote finali vengono eliminate per impostazione predefinita; passa un limit negativo (ad es. split(",", -1)) per mantenerle.
Conversione
| Metodo | Cosa restituisce |
|---|---|
toCharArray() | char[] dei caratteri della stringa |
getBytes() | array di byte UTF-8 (o codifica della piattaforma, a seconda dell'overload) |
String.valueOf(any) | statico — converte qualsiasi valore in una stringa |
Integer.parseInt(s) | converte una stringa in un int |
Double.parseDouble(s) | converte una stringa in un double |
Boolean.parseBoolean(s) | converte una stringa in un boolean |
String.valueOf(42); // "42"
Integer.parseInt("42"); // 42
Double.parseDouble("3.14"); // 3.14
"hello".toCharArray(); // {'h','e','l','l','o'}I metodi parse* generano una NumberFormatException se il testo non è un numero valido, quindi racchiudi l'input dell'utente in un blocco try/catch o validalo prima. A differenza di parseInt, String.valueOf(null) è sicuro — restituisce la stringa "null" invece di lanciare un'eccezione.
Formattazione
| Metodo | Cosa restituisce |
|---|---|
String.format(fmt, args...) | statico — stringa formattata in stile printf |
formatted(args...) (Java 15+) | metodo di istanza, equivalente a format con this come fmt |
String.format("%s is %d", "Ada", 36); // "Ada is 36"
"%s is %d".formatted("Ada", 36); // "Ada is 36"Una dimostrazione completa
Cosa fare dopo
Concatenazione di Stringhe in Java approfondisce +, concat e StringBuilder, incluso quando ciascuno è lo strumento giusto da usare.