JAVA

Le Stringhe

Gestione delle Stringhe in Java: la classe String, l'immutabilità nell'Heap, i metodi di manipolazione testuale e la risoluzione delle anomalie del buffer dello stream di input.

Durata

30 minuti

Software

OnlineGDB

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.

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)

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.


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

  1. In Java la stringa non è un tipo primitivo ma un oggetto appartenente alla classe istanziata java.lang.String.
  2. Le stringhe sono immutabili: ogni alterazione non modifica l\'oggetto originale ma genera una nuova istanza nello Heap.
  3. Il confronto del contenuto testuale deve essere eseguito tassativamente tramite il metodo equals().
  4. I metodi di lettura dello Scanner si dividono in next() per singoli token e nextLine() per righe intere.

Cosa hai imparato
  1. A discriminare la differenza tra uguaglianza dei riferimenti (==) e uguaglianza dei valori (equals).
  2. L\'applicazione dei metodi di istanza fondamentali della classe String come length(), charAt() e toUpperCase().
  3. Le regole di precedenza della valutazione da sinistra a destra durante la concatenazione mista con tipi primitivi.
  4. Il riallineamento del buffer dello stream di input dopo la lettura di tipi numerici per evitare il salto dei metodi stringa.


Java, Stringhe, Oggetti, Programmazione, Informatica, StringPool,