- 1 1. Introduzione: Perché la Ricerca di Stringhe è Importante in Java
- 2 2. Sintassi Base e Caratteristiche del Metodo contains()
- 3 3. Esempi di Utilizzo Pratico e Considerazioni Importanti
- 4 4. Metodi Confrontati Frequent con contains()
- 5 5. Casi d’Uso Comuni e Codice di Esempio
- 5.1 5-1. Validazione dell’Input dell’Utente (Rilevamento di Parole Proibite)
- 5.2 5-2. Analisi dei File di Log (Rilevamento di Messaggi Specifici)
- 5.3 5-3. Filtrare Stringhe in una Lista (Utilizzando Stream API)
- 5.4 5-4. Analisi degli Header di Richieste HTTP o URL
- 5.5 5-5. Verifica di Percorsi o Estensioni di File
- 5.6 Considerazioni Pratiche
- 6 6. Considerazioni sulle Prestazioni
- 7 7. Confronto con Altre Lingue di Programmazione
- 8 8. Domande Frequenti (FAQ)
- 8.1 Q1. contains() è case-sensitive?
- 8.2 Q2. Come posso controllare partite parziali usando espressioni regolari?
- 8.3 Q3. Cosa succede se chiamo contains() su null?
- 8.4 Q4. Cosa succede se passo una stringa vuota (“”) a contains()?
- 8.5 Q5. contains() può cercare più parole chiave contemporaneamente?
- 8.6 Q6. Quando dovrei usare contains() rispetto a indexOf()?
- 9 9. Conclusione
1. Introduzione: Perché la Ricerca di Stringhe è Importante in Java
La manipolazione delle stringhe è una delle operazioni più frequentemente utilizzate durante la programmazione in Java.
Che si tratti di controllare l’input dell’utente, analizzare i contenuti di un file o cercare parole chiave specifiche, spesso è necessario determinare se una particolare parola è contenuta in una data stringa.
Per soddisfare queste esigenze, Java fornisce un metodo comodo chiamato contains().
Con questo metodo, puoi facilmente determinare se una stringa contiene parzialmente un’altra.
Ad esempio, se vuoi controllare se un messaggio di errore contiene una parola chiave specifica, contains() ti permette di farlo in una sola riga di codice.
Soprattutto in scenari che coinvolgono grandi volumi di testo—come applicazioni web, elaborazione di API o analisi di log—il metodo contains() migliora notevolmente la leggibilità e la manutenibilità del codice.
Tuttavia, ci sono anche considerazioni importanti come la sensibilità al caso e la possibilità di null.
Questo articolo spiega in dettaglio il metodo contains() di Java—dall’uso base e dagli errori comuni alle differenze con altri metodi e alle applicazioni pratiche.
Il nostro obiettivo è fornire informazioni utili non solo per i principianti ma anche per gli sviluppatori che utilizzano attivamente Java in progetti reali.
2. Sintassi Base e Caratteristiche del Metodo contains()
Il metodo contains() di Java determina se una stringa contiene parzialmente un’altra stringa.
La sua sintassi è molto semplice, ma è altamente pratica e utilizzata frequentemente nei compiti di programmazione quotidiani.
Sintassi Base
boolean result = targetString.contains(searchString);
Il metodo appartiene alla classe String e accetta un CharSequence (comunemente una String) come argomento.
Il suo valore di ritorno è boolean: true se la stringa target contiene la sottostringa data, e false altrimenti.
Codice di Esempio
String message = "Java programming is fun!";
boolean hasKeyword = message.contains("programming");
System.out.println(hasKeyword); // Output: true
Nell’esempio sopra, la sottostringa "programming" è presente nella stringa target, quindi contains() restituisce true.
Caratteristiche del Metodo
- Controlla solo per corrispondenza parziale: Se hai bisogno di una corrispondenza esatta, usa
equals()invece. - Sensibile al caso: Ad esempio,
"Java"e"java"sono trattati come diversi (dettagli spiegati più avanti). - Non supporta espressioni regolari: Poiché controlla semplicemente la presenza di una stringa, per il pattern matching è necessario
matches()o la classePattern.
Comportamento Quando Viene Passato null
Passare null a contains() attiva una NullPointerException.
Ad esempio, il seguente codice genererà un’eccezione:
String text = null;
System.out.println(text.contains("test")); // Exception occurs
Allo stesso modo, se la stringa target stessa è null, verrà generata la stessa eccezione.
Pertanto, è altamente raccomandato effettuare controlli di null prima di chiamare contains().
3. Esempi di Utilizzo Pratico e Considerazioni Importanti
Il metodo contains() di Java è molto intuitivo e comodo, ma un uso scorretto può portare a bug inaspettati o codice inefficiente.
Questa sezione spiega l’uso base di contains() insieme ai punti chiave di cui dovresti essere consapevole.
3-1. Esempio di Utilizzo Base
Il seguente codice dimostra un semplice esempio di controllo se la stringa target contiene una parola chiave specifica:
String sentence = "今日はJavaの勉強をしています。";
if (sentence.contains("Java")) {
System.out.println("Javaが含まれています。");
} else {
System.out.println("Javaは含まれていません。");
}
Come mostrato, contains() è frequentemente combinato con istruzioni if per eseguire ramificazioni condizionali.
3-2. Sensibilità al Caso
Il metodo contains() è sensibile al caso.
Ad esempio, il seguente codice restituisce false:
String text = "Welcome to Java";
System.out.println(text.contains("java")); // false
In tali casi, è comune convertire le stringhe in minuscolo (o maiuscolo) prima del confronto:
String text = "Welcome to Java";
System.out.println(text.toLowerCase().contains("java")); // true
Questo approccio aiuta a eliminare le differenze nel caso di input (ad es., input dell’utente).
3-3. Gestione di null e Stringhe Vuote
Una delle considerazioni più importanti quando si usa contains() è la gestione di null.
Se la stringa di destinazione o l’argomento sono null, si verificherà una NullPointerException.
String text = null;
System.out.println(text.contains("test")); // Runtime error
Per evitare questo problema, aggiungi sempre un controllo su null:
if (text != null && text.contains("test")) {
// Safe to process
}
Nota anche:
Passare una stringa vuota ("") restituisce sempre true.
String sample = "test";
System.out.println(sample.contains("")); // true
Tuttavia, questo comportamento è raramente utile nella pratica e può portare involontariamente a bug se le stringhe vuote vengono passate inavvertitamente.
3-4. Non Supporta Ricerche con Più Parole Chiave
contains() può verificare solo una parola chiave alla volta.
Per verificare più parole chiave, devi chiamare contains() più volte oppure usare l’API Stream.
String target = "エラーコード123:アクセス拒否";
if (target.contains("エラー") || target.contains("拒否")) {
System.out.println("問題のあるメッセージです。");
}
Oppure, per insiemi di parole chiave dinamici:
List<String> keywords = Arrays.asList("エラー", "障害", "失敗");
boolean found = keywords.stream().anyMatch(target::contains);
4. Metodi Confrontati Frequent con contains()
Java fornisce diversi metodi per confrontare stringhe o verificare se esiste una sottostringa specifica.
Tra questi, contains() è usato per “corrispondenza parziale”, ma altri metodi servono a scopi simili.
Questa sezione spiega le caratteristiche e le differenze di tali metodi per aiutarti a usarli in modo appropriato.
4-1. Differenza da equals(): Corrispondenza Esatta vs. Corrispondenza Parziale
equals() determina se due stringhe sono esattamente identiche.
Al contrario, contains() verifica le corrispondenze parziali.
String a = "Java";
String b = "Java";
System.out.println(a.equals(b)); // true: Exact match
System.out.println(a.contains("av")); // true: Partial match
Principali differenze:
| Comparison | equals() | contains() |
|---|---|---|
| Match Type | Exact match | Partial match |
| Case Sensitivity | Sensitive | Sensitive |
| Argument Type | Object | CharSequence |
Linee Guida d’Uso:
Usa equals() quando i valori devono corrispondere esattamente (ad es., verifica ID).
Usa contains() quando le corrispondenze parziali sono accettabili (ad es., ricerca di parole chiave).
4-2. Differenza da indexOf(): Se Hai Bisogno della Posizione
Il metodo indexOf() può anche essere usato per verificare se una sottostringa esiste all’interno di una stringa.
La differenza è che indexOf() restituisce l’indice di inizio della sottostringa se trovata.
Se la sottostringa non è trovata, restituisce -1.
String text = "Hello, Java World!";
System.out.println(text.indexOf("Java")); // 7
System.out.println(text.indexOf("Python")); // -1
Puoi anche usare indexOf() per replicare il comportamento di contains():
if (text.indexOf("Java") >= 0) {
System.out.println("It is contained.");
}
Linee Guida d’Uso:
Se non ti serve l’indice, contains() è più leggibile e preferibile.
4-3. Differenza da matches(): Supporto per Espressioni Regolari
Il metodo matches() verifica se una stringa corrisponde interamente a una data espressione regolare.
Al contrario, contains() verifica solo corrispondenze di sottostringhe letterali e non supporta le regex.
String text = "abc123";
System.out.println(text.matches(".*123")); // true
System.out.println(text.contains(".*123")); // false (not regex)
Se desideri una corrispondenza parziale basata su regex, usa la classe Pattern:
4-4. Riepilogo del Confronto delle Funzionalità
| Method | Purpose | Return Type | Regex Support | Use Case |
|---|---|---|---|---|
contains() | Partial match | boolean | No | Keyword search |
equals() | Exact match | boolean | No | ID/password checks |
indexOf() | Get match position | int | No | Index-based processing |
matches() | Regex match | boolean | Yes | Find pattern-based strings |
5. Casi d’Uso Comuni e Codice di Esempio
Il metodo contains() di Java è semplice ma ampiamente usato in scenari di sviluppo reale.
I casi d’uso tipici includono la validazione dell’input dell’utente, l’analisi dei log e le operazioni di filtraggio.
Questa sezione copre esempi pratici con il relativo codice.
5-1. Validazione dell’Input dell’Utente (Rilevamento di Parole Proibite)
In moduli o applicazioni di chat, potresti dover rilevare se sono incluse determinate parole proibite.
String input = "このアプリは最悪だ";
String banned = "最悪";
if (input.contains(banned)) {
System.out.println("不適切な言葉が含まれています。");
}
Gestione di più parole NG:
List<String> bannedWords = Arrays.asList("最悪", "バカ", "死ね");
for (String word : bannedWords) {
if (input.contains(word)) {
System.out.println("不適切な言葉が含まれています: " + word);
break;
}
}
5-2. Analisi dei File di Log (Rilevamento di Messaggi Specifici)
Durante l’analisi dei log di sistema o dell’applicazione, potresti voler estrarre solo le righe contenenti parole chiave specifiche come ERROR o WARN.
List<String> logs = Arrays.asList(
"[INFO] サーバーが起動しました",
"[ERROR] データベース接続失敗",
"[WARN] メモリ使用率が高い"
);
for (String log : logs) {
if (log.contains("ERROR")) {
System.out.println("エラー発生ログ: " + log);
}
}

5-3. Filtrare Stringhe in una Lista (Utilizzando Stream API)
Quando si gestiscono grandi set di dati, usa la Stream API per estrarre solo gli elementi che contengono una sottostringa specifica:
List<String> users = Arrays.asList("tanaka@example.com", "sato@gmail.com", "yamada@yahoo.co.jp");
List<String> gmailUsers = users.stream()
.filter(email -> email.contains("@gmail.com"))
.collect(Collectors.toList());
System.out.println(gmailUsers); // [sato@gmail.com]
5-4. Analisi degli Header di Richieste HTTP o URL
nello sviluppo web, il routing o la gestione specifica per dispositivo può richiedere il controllo di sottostringhe nello User-Agent o nell’URL.
String userAgent = "Mozilla/5.0 (iPhone; CPU iPhone OS 16_0 like Mac OS X)";
if (userAgent.contains("iPhone")) {
System.out.println("スマートフォンからのアクセスです。");
}
5-5. Verifica di Percorsi o Estensioni di File
Per determinare il tipo di un file dal suo percorso:
String filePath = "/usr/local/data/sample.csv";
if (filePath.contains(".csv")) {
System.out.println("CSVファイルです。");
}
Nota:
Per i controlli delle estensioni dei file, endsWith(".csv") è spesso più preciso.
Considerazioni Pratiche
- Applica la normalizzazione (ad es.,
toLowerCase(),trim()) quando è richiesta precisione. - Per dati su larga scala, considera l’uso della Stream API o delle espressioni regolari.
- Ricorda che
contains()è una corrispondenza parziale—combinalo con altre condizioni per una logica più sicura.
6. Considerazioni sulle Prestazioni
Sebbene il metodo contains() offra eccellente leggibilità e semplicità, è necessario considerare il suo impatto sulle prestazioni quando si gestiscono grandi dataset o si eseguono operazioni ripetute.
Questa sezione spiega il costo di elaborazione di contains() e approcci alternativi per migliorare l’efficienza.
6-1. Comportamento Interno e Complessità Temporale di contains()
Il metodo contains() ricerca la stringa target sequenzialmente dall’inizio per individuare la sottostringa.
Internamente, si basa sul metodo indexOf(), e la sua complessità temporale nel caso peggiore è:
O(n × m)
– n = lunghezza della stringa target
– m = lunghezza della stringa di ricerca
Esempio di elaborazione intensiva:
for (String line : hugeTextList) {
if (line.contains("error")) {
// processing
}
}
Ciò può influire significativamente sulle prestazioni quando viene ripetuto all’interno di grandi cicli.
6-2. Tecniche per Migliorare le Prestazioni durante Ricerche Frequenti
Quando si utilizza contains() ripetutamente su grandi dataset, le seguenti tecniche possono migliorare la velocità di elaborazione:
• Convertire tutte le stringhe in minuscolo in anticipo
Invece di chiamare toLowerCase() ad ogni confronto, normalizza le stringhe in anticipo:
List<String> normalizedList = originalList.stream()
.map(String::toLowerCase)
.collect(Collectors.toList());
• Utilizzare Stream API con parallel() per l’elaborazione parallela
Sfrutta i core della CPU per accelerare le ricerche:
List<String> result = hugeTextList.parallelStream()
.filter(line -> line.contains("keyword"))
.collect(Collectors.toList());
• Usare espressioni regolari per pattern di ricerca complessi
%%CODEBLOCK9%%
Se le condizioni sono complesse e possono essere espresse in un singolo regex, Pattern potrebbe performare meglio:
Pattern pattern = Pattern.compile("error|fail|fatal");
for (String log : logs) {
if (pattern.matcher(log).find()) {
// matched
}
}
6-3. Considerazioni sull’Efficienza della Memoria e sulla Riutilizzabilità
Le operazioni che convertono frequentemente le stringhe—come toLowerCase() o substring()—possono generare molti oggetti stringa non necessari, influenzando l’uso della memoria.
Questo è particolarmente importante per applicazioni a lungo termine o elaborazione lato server.
Punti chiave:
- Evitare la creazione di istanze di stringa non necessarie.
- Per grandi dataset, considerare il buffering o l’elaborazione a chunk.
- La cache dei risultati ripetuti di
contains()può migliorare le prestazioni in certi casi.
7. Confronto con Altre Lingue di Programmazione
Il metodo contains() di Java offre una corrispondenza di sottostringhe semplice e affidabile, ma altre lingue forniscono funzionalità simili con le loro caratteristiche proprie.
Questa sezione confronta il controllo di sottostringhe in Python, JavaScript e C# per evidenziare differenze e somiglianze.
7-1. Python: Partita Parziale Semplice con l’Operatore in
In Python, puoi controllare l’inclusione di sottostringhe usando l’operatore in:
text = "Hello, Python!"
if "Python" in text:
print("含まれています")
Questa sintassi è estremamente leggibile—quasi come linguaggio naturale—e richiede un apprendimento minimo. Differenze e Note:
inè un operatore del linguaggio, non un metodo.- Python è anche case-sensitive per il confronto delle stringhe.
Noneproduce un’eccezione; sono richiesti controlli null.
7-2. JavaScript: Partita Parziale con includes()
In JavaScript (ES6+), puoi usare il metodo includes():
const text = "JavaScript is fun";
console.log(text.includes("fun")); // true
Questo metodo è molto simile al contains() di Java ed è facile da migrare mentalmente. Differenze e Note:
- Passare
undefinednon genera un’eccezione; semplicemente restituiscefalse. includes()funziona anche su array, aumentando la sua versatilità.
7-3. C#: Contains() Simile a Java
C# offre anche un metodo Contains() con comportamento simile a Java:
string text = "Welcome to C#";
bool result = text.Contains("C#");
Differenze e Note:
Contains()di C# è case-sensitive per impostazione predefinita, ma puoi ignorare il case usandoStringComparison.OrdinalIgnoreCase.- Passare null attiva
ArgumentNullException.
7-4. Tabella di Confronto Tra le Lingue
| Language | Example Syntax | Case Sensitivity | Notes |
|---|---|---|---|
| Java | "abc".contains("a") | Sensitive | Throws exception on null |
| Python | "a" in "abc" | Sensitive | Most intuitive syntax |
| JavaScript | "abc".includes("a") | Sensitive | Also works for arrays |
| C# | "abc".Contains("a") | Sensitive (configurable) | Comparison mode can be chosen |
Riepilogo: Scegli la Sintassi Giusta per il Tuo Caso d’Uso
Sebbene il controllo di sottostringhe sia un requisito comune tra le lingue, ogni lingua fornisce il proprio metodo o sintassi.
Il contains() di Java offre stabilità e chiarezza, rendendolo ben adatto a sistemi enterprise e applicazioni manutenibili.
Lingue come Python e JavaScript offrono una sintassi più semplice e concisa, che può essere ideale per script leggeri o prototipazione rapida.
Comprendendo sia i concetti comuni che le funzionalità specifiche di ogni lingua, sarai in grado di scrivere codice più sicuro ed efficiente in varie lingue.
8. Domande Frequenti (FAQ)
Di seguito ci sono domande comunemente poste riguardo al metodo contains() di Java—per aiutarti a capire i punti tricky e evitare comuni errori.
Q1. contains() è case-sensitive?
Sì, è case-sensitive. Ad esempio, "Java".contains("java") restituisce false. Soluzione:
String input = "Welcome to Java";
boolean result = input.toLowerCase().contains("java");
Q2. Come posso controllare partite parziali usando espressioni regolari?
contains() non supporta espressioni regolari.
Usa matches() o la classe Pattern invece. Esempio (controllo pattern numerico):
import java.util.regex.Pattern;
import java.util.regex.Matcher;
String text = "注文番号: A123456";
Pattern pattern = Pattern.compile("A\d+");
Matcher matcher = pattern.matcher(text);
if (matcher.find()) {
System.out.println("パターンに一致しました。");
}
Q3. Cosa succede se chiamo contains() su null?
Verrà generata una NullPointerException.
String target = null;
System.out.println(target.contains("test")); // Error
Soluzione:
if (target != null && target.contains("test")) {
System.out.println("含まれています。");
}
Q4. Cosa succede se passo una stringa vuota (“”) a contains()?
Restituisce sempre true.
String text = "Java";
System.out.println(text.contains("")); // true
Sebbene faccia parte della specifica ufficiale, questo comportamento è raramente utile e può causare bug inaspettati se le stringhe vuote non sono previste.
Q5. contains() può cercare più parole chiave contemporaneamente?
No. Ogni chiamata controlla una sola parola chiave.
String text = "本日はシステムエラーが発生しました";
if (text.contains("エラー") || text.contains("障害") || text.contains("失敗")) {
System.out.println("問題が検出されました。");
}
Approccio dinamico:
List<String> keywords = Arrays.asList("エラー", "障害", "失敗");
boolean found = keywords.stream().anyMatch(text::contains);
Q6. Quando dovrei usare contains() rispetto a indexOf()?
contains() restituisce un boolean, mentre indexOf() restituisce un indice numerico.
- Usa
contains()quando vuoi semplicemente sapere se la sottostringa esiste. - Usa
indexOf()quando ti serve anche la posizione.String text = "Error: Disk full"; if (text.contains("Error")) { int pos = text.indexOf("Error"); System.out.println("Position: " + pos); }
9. Conclusione
Il metodo contains() di Java è uno strumento potente e comodo per determinare se una specifica sottostringa è contenuta all’interno di una stringa.
È ampiamente utilizzato in vari scenari, come la validazione dell’input dell’utente, l’analisi dei log e il filtraggio dei dati.
In questo articolo abbiamo trattato:
- Sintassi di base e valori di ritorno
- Sensibilità al maiuscolo/minuscolo e come gestirla
- Gestione di null e stringhe vuote
- Differenze rispetto ad altri metodi di confronto di stringhe
- Casi d’uso pratici: validazione, ricerca nei log, elaborazione con Stream
- Considerazioni sulle prestazioni e tecniche di ottimizzazione
- Confronto con Python, JavaScript e C#
- Domande frequenti e suggerimenti per la risoluzione dei problemi
Sebbene contains() sia intuitivo e versatile, il suo utilizzo dovrebbe essere valutato con attenzione nei casi che coinvolgono grandi dataset, chiamate frequenti o condizioni di ricerca complesse.
Combinando normalizzazione, elaborazione parallela, regex e strategie di caching, è possibile mantenere sia le prestazioni sia la leggibilità.
Poiché contains() è fondamentale per lavorare con le stringhe in Java, speriamo che questo articolo ti aiuti a usar in modo più sicuro ed efficace nei tuoi progetti di sviluppo.

