- Distinguere tra tipi di dati primitivi e tipi di dati oggetto (Riferimento)
- Utilizzare i metodi della classe String per elaborare dati testuali
- Applicare correttamente l'operatore di concatenazione e il metodo equals
- Implementare algoritmi per la validazione e trasformazione di stringhe
In Java, una Stringa non è un tipo di dato primitivo (come int o double), ma è un Oggetto appartenente alla classe java.lang.String.
Questo significa che ogni stringa porta con sé una serie di "strumenti" (metodi) pronti all'uso.
1.1 Caratteristiche fondamentali
- Immutabilità: Una volta creata, una stringa non può essere modificata. Ogni operazione che sembra modificarla in realtà ne crea una nuova.
- Indici: Come nei vettori, i caratteri di una stringa partono dall'indice 0.
Scanner esistono due metodi differenti. La scelta dipende se devi leggere una singola parola o una frase intera.
1.2 Lettura di una singola parola: next()
Il metodo next() legge i caratteri fino al primo spazio vuoto, tabulazione o invio. È l'ideale per leggere nomi singoli o codici senza spazi.
Scanner in = new Scanner(System.in);
System.out.print("Inserisci il tuo nome: ");
// Se l'utente scrive "Mario Rossi", leggerà solo "Mario"
String nome = in.next();
1.3 Lettura di una riga intera: nextLine()
Il metodo nextLine() legge tutto ciò che l'utente scrive fino a quando non preme il tasto Invio. È indispensabile per leggere frasi, indirizzi o nomi composti.
Scanner in = new Scanner(System.in);
System.out.print("Inserisci il tuo nome completo: ");
// Se l'utente scrive "Mario Rossi", leggerà "Mario Rossi" correttamente
String nomeCompleto = in.nextLine();
1.4 Metodi principali della classe String
| Metodo | Descrizione | Esempio |
|---|---|---|
| length() | Restituisce la lunghezza della stringa. | s.length() |
| toUpperCase() / toLowerCase() | Converte tutto in maiuscolo o minuscolo. | s.toUpperCase() |
| charAt(int index) | Restituisce il carattere alla posizione indicata. | s.charAt(0) |
| equals(String s) | Fondamentale: confronta il contenuto di due stringhe. | s1.equals(s2) |
== (che confronta l'indirizzo di memoria), ma sempre il metodo .equals().
nextInt() o nextDouble() e subito dopo nextLine(), il programma sembrerà "saltare" la lettura della stringa.
Soluzione: Inserisci un
in.nextLine(); a vuoto dopo la lettura del numero per "pulire" il tasto Invio rimasto in memoria.
Esempio di "Pulizia Buffer"
System.out.print("Inserisci l'età: ");
int eta = in.nextInt();
in.nextLine(); // PULIZIA: "Mangia" l'invio rimasto nel buffer
System.out.print("Inserisci il nome: ");
String nome = in.nextLine(); // Ora funzionerà correttamente!
1. La concatenazione semplice
Possiamo unire stringhe fisse (testo tra doppi apici) e variabili. Ricorda di inserire manualmente gli spazi all'interno delle virgolette, altrimenti i testi risulteranno attaccati.
String nome = "Mario";
String cognome = "Rossi";
// Senza spazio: "MarioRossi"
String unitoSbagliato = nome + cognome;
// Con spazio: "Mario Rossi"
String unitoCorretto = nome + " " + cognome;
2. Concatenazione con Tipi Diversi
Java è molto "gentile" nella concatenazione: se provi a unire una Stringa con un int, un double o un boolean, convertirà automaticamente il valore numerico in testo.
int punteggio = 50;
String messaggio = "Il tuo punteggio è: " + punteggio; // Risultato: "Il tuo punteggio è: 50"
3. Attenzione alla Precedenza (L'errore più comune)
Java legge le espressioni da sinistra a destra. Questo può creare risultati inaspettati se mescoliamo somme e concatenazioni senza parentesi.
| Esempio di Codice | Risultato Finale | Perché? |
|---|---|---|
"Totale: " + 10 + 20 |
"Totale: 1020" | Legge "Totale: 10" e poi aggiunge "20" come testo. |
"Totale: " + (10 + 20) |
"Totale: 30" | Le parentesi forzano prima la somma matematica. |
10 + 20 + " è il totale" |
"30 è il totale" | Inizia con due numeri, fa la somma (30), poi incontra la stringa. |
LABORATORIO
Manipolazione e Validazione Testo
In questo laboratorio analizzeremo le stringhe inserite dall'utente per simulare un sistema di validazione dati.
- OnlineGDB.com
- Linguaggio: Java
1 Analisi di una Stringa
Scriviamo un programma che chieda all'utente una parola e ne mostri la lunghezza e il primo carattere.
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
Scanner in = new Scanner(System.in);
System.out.print("Inserisci una parola: ");
String parola = in.next();
System.out.println("La parola è lunga: " + parola.length() + " caratteri.");
System.out.println("Il primo carattere è: " + parola.charAt(0));
System.out.println("In maiuscolo: " + parola.toUpperCase());
in.close();
}
}
2 Esercitazione Guidata: Verifica Password
Simuliamo un sistema di login. Dobbiamo verificare se la password inserita è corretta (confronto stringhe).
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
Scanner tastiera = new Scanner(System.in);
String passwordCorretta = "Java2024";
System.out.print("Inserisci la password: ");
String inputUtente = tastiera.next();
// Uso corretto di .equals()
boolean accessoValido = inputUtente.equals(passwordCorretta);
System.out.println("Accesso consentito: " + accessoValido);
tastiera.close();
}
}
3 Esercizio: Formattazione Anagrafica
Scenario: Un software deve correggere i nomi inseriti dagli utenti in un database. Scrivete un programma Java che:
- Chieda all'utente il proprio Nome e Cognome separatamente.
- Calcoli la lunghezza totale del nome completo (somma delle due stringhe).
- Controlli se il cognome è uguale a "Rossi" (ignorando maiuscole/minuscole con
equalsIgnoreCase). - Stampi il nome completo tutto in MAIUSCOLO.
In sintesi
Argomenti: concetti principali, riepilogo, competenze
- In Java la stringa non è un tipo primitivo ma un oggetto appartenente alla classe istanziata
java.lang.String. - Le stringhe sono immutabili: ogni alterazione non modifica l\'oggetto originale ma genera una nuova istanza nello Heap.
- Il confronto del contenuto testuale deve essere eseguito tassativamente tramite il metodo
equals(). - I metodi di lettura dello Scanner si dividono in
next()per singoli token enextLine()per righe intere.
- A discriminare la differenza tra uguaglianza dei riferimenti (
==) e uguaglianza dei valori (equals). - L\'applicazione dei metodi di istanza fondamentali della classe String come
length(),charAt()etoUpperCase(). - Le regole di precedenza della valutazione da sinistra a destra durante la concatenazione mista con tipi primitivi.
- Il riallineamento del buffer dello stream di input dopo la lettura di tipi numerici per evitare il salto dei metodi stringa.