Il tutorial completo per imparare Java da zero: dalla sintassi di base alla programmazione a oggetti, con esempi di codice spiegati passo passo.
Introduzione a Java
Java è un linguaggio di programmazione orientato agli oggetti, creato da Sun Microsystems nel 1995 e oggi mantenuto da Oracle. È uno dei linguaggi più usati al mondo per applicazioni aziendali, app Android, sistemi bancari e software di grandi dimensioni.
Il suo motto è “Write Once, Run Anywhere”: il codice Java viene compilato in bytecode ed eseguito dalla JVM (Java Virtual Machine), perciò gira su qualsiasi sistema operativo senza modifiche. Java è fortemente tipizzato e segue rigorosamente il paradigma a oggetti.
📌 Java non si esegue nel browser: in questo corso gli esempi si leggono e si modificano con la sintassi colorata. Per eseguirli ti serve il JDK installato sul tuo computer (vedi “Installazione”).
Esempio
Installare Java (Get Started)
Per programmare in Java ti serve il JDK (Java Development Kit), che include il compilatore javac e la JVM. Si scarica da oracle.com o, in versione open source, da adoptium.net. Come editor si usano IntelliJ IDEA, Eclipse o VS Code.
Compilare ed eseguire
Un file Java si salva con lo stesso nome della classe pubblica (es. Main.java). Dal terminale:
Terminale
Sintassi e primo programma
Ogni programma Java è organizzato in classi. L'esecuzione parte dal metodo speciale main. Le istruzioni terminano con il punto e virgola ; e i blocchi sono racchiusi tra parentesi graffe { }.
Esempio
Output: System.out.println
Per stampare a schermo si usa System.out.println() (stampa e va a capo) oppure System.out.print() (senza andare a capo).
Esempio
I commenti
I commenti spiegano il codice e non vengono eseguiti: su una riga con //, su più righe con /* ... */.
Esempio
Le variabili
In Java ogni variabile deve essere dichiarata con il suo tipo (tipizzazione statica). La sintassi è tipo nome = valore;. Con final si crea una costante non modificabile.
Esempio
I tipi di dato
Java distingue i tipi primitivi (valori semplici) dai tipi riferimento (oggetti come String, array).
Tipo
Descrizione
Esempio
int
Intero
42
double
Decimale
3.14
char
Singolo carattere
'A'
boolean
Vero/falso
true
String
Testo (oggetto)
"ciao"
Esempio
Il casting (conversione di tipo)
Il casting converte un tipo in un altro. Quello widening (es. int → double) è automatico; quello narrowing (es. double → int) va indicato esplicitamente fra parentesi.
Esempio
Gli operatori
Java offre operatori aritmetici (+ - * / %), di confronto (== != > <), logici (&&, ||, !) e di assegnazione (= += -=).
Esempio
Le stringhe
La classe String rappresenta il testo e offre molti metodi: length(), toUpperCase(), substring(), indexOf(). Le stringhe si concatenano con +.
Esempio
La classe Math
La classe Math fornisce funzioni matematiche: Math.sqrt(), Math.pow(), Math.max(), Math.random() e la costante Math.PI.
Esempio
L'input dell'utente
Per leggere dati dalla tastiera si usa la classe Scanner del package java.util.
Esempio
Le condizioni: if, else if, else
Le istruzioni condizionali eseguono codice in base a una condizione booleana.
Esempio
Il costrutto switch
Lo switch confronta una variabile con più valori (case). Usa break per uscire e default per il caso generale.
Esempio
Il ciclo while
Il while ripete un blocco finché la condizione è vera. La variante do...while esegue almeno una volta.
Esempio
Il ciclo for
Il for è ideale quando conosci il numero di ripetizioni. Esiste anche il for-each per scorrere array e collezioni.
Esempio
Gli array
Un array contiene più valori dello stesso tipo, con dimensione fissa. Si accede con l'indice (parte da 0) e si ottiene la lunghezza con .length.
Esempio
I metodi
Un metodo è un blocco di codice riutilizzabile con un nome. void indica che non restituisce nulla; static permette di chiamarlo senza creare un oggetto.
Esempio
Parametri e valore di ritorno
Un metodo può ricevere parametri e restituire un valore con return, indicandone il tipo al posto di void.
Esempio
Programmazione a oggetti (OOP)
Java è un linguaggio profondamente orientato agli oggetti. Tutto ruota attorno a classi (i modelli) e oggetti (le istanze). I pilastri sono incapsulamento, ereditarietà, polimorfismo e astrazione: permettono di scrivere software grande, ordinato e riutilizzabile.
📦 Una classe è lo “stampo”, gli oggetti sono i “biscotti” creati con quello stampo.
Classi e oggetti
Una classe definisce attributi (dati) e metodi (comportamenti). Con new si crea un oggetto.
Esempio
Gli attributi
Gli attributi (o campi) sono le variabili che descrivono lo stato di un oggetto. Ogni oggetto ha la propria copia.
Esempio
I metodi di classe
I metodi definiscono il comportamento degli oggetti e possono usare i loro attributi.
Esempio
I costruttori
Un costruttore è un metodo speciale (stesso nome della classe) chiamato automaticamente con new per inizializzare l'oggetto. La parola chiave this indica l'oggetto corrente.
Esempio
I modificatori d'accesso
I modificatori d'accesso stabiliscono la visibilità di attributi e metodi: public (ovunque), private (solo nella classe), protected (classe e sottoclassi), o di default (stesso package).
Modificatore
Visibilità
public
Da qualsiasi classe
private
Solo dentro la classe
protected
Classe, package e sottoclassi
L'incapsulamento
L'incapsulamento protegge i dati rendendo gli attributi private e fornendo metodi pubblici getter e setter per leggerli e modificarli in modo controllato.
Esempio
L'ereditarietà
Con extends una classe (figlia) eredita attributi e metodi da un'altra (genitore), riutilizzando il codice. super richiama il genitore.
Esempio
Il polimorfismo
Il polimorfismo permette di usare lo stesso metodo con comportamenti diversi a seconda dell'oggetto. Con l'override una sottoclasse ridefinisce un metodo del genitore.
Esempio
Le interfacce
Un'interfaccia definisce un “contratto” di metodi che le classi devono implementare con implements. È il modo di Java per l'astrazione e per ottenere una forma di ereditarietà multipla.
Esempio
ArrayList e collezioni
L'ArrayList è una lista dinamica (a dimensione variabile), parte del Collections Framework. A differenza degli array può crescere e ridursi.
Esempio
La gestione delle eccezioni
Le eccezioni sono errori che si verificano durante l'esecuzione. Si gestiscono con try ... catch (e l'opzionale finally) per evitare che il programma vada in crash.
Esempio
Booleans in Java
Un tipo booleano (boolean) può assumere solo due valori: true o false. È il tipo restituito da tutte le espressioni di confronto.
Esempio
Gli operatori logici: && (AND), || (OR), ! (NOT). Sono fondamentali per condizioni composte nei blocchi if, while e for.
Break e Continue
break interrompe immediatamente il ciclo (o lo switch). continue salta l'iterazione corrente e passa alla successiva.
Break
Continue
Overloading dei metodi
Java permette di definire più metodi con lo stesso nome ma parametri diversi (tipo o numero). Questo si chiama method overloading.
Esempio
💡 L'overloading migliora la leggibilità del codice: stesso nome semantico, comportamento adattato al tipo.
Scope delle variabili
Lo scope (ambito) di una variabile determina dove può essere usata. In Java le variabili dichiarate dentro un blocco { } esistono solo all'interno di quel blocco.
Esempio
Variabili locali: esistono solo nel metodo/blocco in cui sono dichiarate
Attributi di classe: visibili in tutti i metodi della classe
Variabili statiche: condivise tra tutte le istanze della classe
Ricorsione
Un metodo ricorsivo è un metodo che chiama se stesso. Ogni chiamata ricorsiva deve avvicinarsi a un caso base che interrompe la ricorsione.
Fattoriale ricorsivo
⚠️ Senza caso base la ricorsione è infinita e genera StackOverflowError. Usare la ricorsione con attenzione per dati molto grandi.
Parola chiave this
this si riferisce all'istanza corrente della classe. Si usa per disambiguare attributi da parametri con lo stesso nome, o per chiamare un altro costruttore.
Esempio
Package e API Java
Un package è un raggruppamento di classi correlate, simile a una cartella. Java include una ricca libreria standard (Java API) organizzata in package.
Importare package
Package
Contenuto
java.lang
String, Math, Integer, System (importato automaticamente)
java.util
ArrayList, HashMap, Scanner, Date, Collections
java.io
File, InputStream, OutputStream, Reader, Writer
java.time
LocalDate, LocalTime, LocalDateTime
java.net
URL, HttpURLConnection, Socket
Parola chiave super
super fa riferimento alla classe padre (superclasse). Si usa per chiamare il costruttore o i metodi della superclasse.
Esempio
Classi interne (Inner Classes)
Una classe interna è una classe definita all'interno di un'altra classe. Ha accesso agli attributi privati della classe esterna.
Esempio
Astrazione
L'astrazione nasconde i dettagli implementativi ed espone solo le funzionalità essenziali. Si realizza con classi astratte (abstract) e interfacce.
Classe astratta
📌 Una classe astratta non può essere istanziata direttamente. Deve essere estesa da una classe concreta che implementa tutti i metodi astratti.
Classi anonime
Una classe anonima è una classe senza nome, definita e istanziata in un'unica espressione. Utile per implementare interfacce o classi astratte al volo.
Esempio
Enum
Un enum (enumerazione) è un tipo speciale con un insieme fisso di costanti. Si usa per valori predefiniti come giorni, stati, direzioni.
Esempio
Date e ora in Java
Da Java 8 si usa il package java.time per gestire date e orari in modo sicuro e immutabile.
Esempio
Classe
Descrizione
LocalDate
Solo data (anno, mese, giorno)
LocalTime
Solo ora (ore, minuti, secondi)
LocalDateTime
Data + ora
DateTimeFormatter
Formatta date come stringa
Period
Differenza tra date
Debugging in Java
Il debugging è il processo di individuazione e correzione degli errori. Java distingue tre tipi di errori: syntax errors (errori di sintassi), runtime errors (errori a runtime) e logic errors (errori logici).
Syntax error: rilevato dal compilatore (manca ;, parentesi, ecc.)
Runtime error: genera un'eccezione durante l'esecuzione (NullPointerException, ArrayIndexOutOfBoundsException)
Logic error: il programma gira ma produce risultati sbagliati
Strumenti di debug: System.out.println() per stampe di controllo, IDE debugger (IntelliJ IDEA, Eclipse, VS Code) per breakpoint, watch variables, step-by-step execution.
💡 Usa il debugger dell'IDE: posiziona un breakpoint su una riga, avvia in modalità debug e osserva i valori delle variabili in tempo reale.
Eccezioni multiple (multi-catch)
Java permette di catturare più tipi di eccezione nello stesso blocco catch usando |, oppure con più blocchi catch consecutivi.
Esempio
Le eccezioni principali di Java:
Eccezione
Causa
NullPointerException
Uso di variabile non inizializzata
ArrayIndexOutOfBoundsException
Accesso oltre i limiti dell'array
NumberFormatException
Conversione stringa non numerica
ClassCastException
Cast tra tipi incompatibili
IllegalArgumentException
Argomento non valido passato a un metodo
Try-with-resources
Il try-with-resources (Java 7+) garantisce che le risorse (file, connessioni DB, stream) vengano chiuse automaticamente al termine del blocco, anche in caso di eccezione.
Esempio
💡 Funziona con qualsiasi classe che implementa AutoCloseable: File, Stream, Connection JDBC, ecc.
Gestione file in Java
La classe File del package java.io permette di lavorare con file e directory: creare, leggere, scrivere, eliminare file e navigare il filesystem.
Info su un file
Creare un file
Il metodo createNewFile() crea un nuovo file vuoto. Restituisce true se il file è stato creato, false se esiste già.
Esempio
Scrivere su file
FileWriter scrive testo in un file. Con true come secondo parametro, aggiunge al file esistente (append mode).
Esempio
Leggere un file
Scanner con File permette di leggere riga per riga un file di testo in modo semplice.
Esempio
Eliminare un file
Il metodo delete() della classe File elimina un file. Restituisce true in caso di successo.
Esempio
FileInputStream e FileOutputStream
Per leggere e scrivere file binari (immagini, PDF, audio) si usano FileInputStream e FileOutputStream che operano sui byte.
FileInputStream
BufferedReader e BufferedWriter
BufferedReader e BufferedWriter aggiungono un buffer di memoria che riduce gli accessi al disco, rendendo la lettura/scrittura di file di testo molto più efficiente.
Esempio
Collections Framework
Il Java Collections Framework è un insieme di interfacce e classi per gestire gruppi di oggetti in modo efficiente. Le interfacce principali sono List, Set e Map.
Interfaccia
Implementazioni principali
Caratteristica
List
ArrayList, LinkedList
Ordinata, ammette duplicati
Set
HashSet, TreeSet, LinkedHashSet
Non ammette duplicati
Map
HashMap, TreeMap, LinkedHashMap
Coppie chiave-valore
Queue
LinkedList, PriorityQueue
FIFO (coda)
Deque
ArrayDeque
Coda a doppia entrata
📌 Importa sempre da java.util.*. Preferisci programmare con l'interfaccia (List<String> lista = new ArrayList<>()) per maggiore flessibilità.
LinkedList
LinkedList implementa sia List che Deque. Ogni elemento è un nodo collegato al precedente e al successivo. Inserimento/cancellazione in testa o coda sono O(1), ma l'accesso casuale è O(n).
Esempio
HashSet
HashSet è una collezione che non ammette duplicati e non garantisce nessun ordine. Usa una tabella hash internamente — operazioni di ricerca e inserimento sono O(1).
Esempio
TreeSet
TreeSet è un Set che mantiene gli elementi in ordine naturale crescente (o con un comparatore personalizzato). Usa un albero red-black internamente — operazioni O(log n).
Esempio
HashMap e TreeMap
HashMap memorizza coppie chiave → valore. Le chiavi sono uniche; i valori possono ripetersi. TreeMap tiene le chiavi ordinate.
HashMap
TreeMap
TreeMap è come HashMap ma mantiene le chiavi ordinate. Utile quando serve iterare in ordine alfabetico o numerico.
Esempio
Iterator
Un Iterator permette di scorrere una collezione in modo sicuro, potendo rimuovere elementi durante l'iterazione senza ConcurrentModificationException.
Esempio
Algoritmi di ordinamento e ricerca
La classe Collections fornisce algoritmi pronti per ordinare, cercare e manipolare collezioni. Arrays fa lo stesso per gli array.
Esempio
Complessità
Algoritmo
Best
Medio
Worst
Collections.sort()
Timsort
O(n)
O(n log n)
O(n log n)
Arrays.sort()
Dual-Pivot Quicksort
O(n log n)
O(n log n)
O(n²)
Collections.binarySearch()
Binary search
O(1)
O(log n)
O(log n)
Wrapper class
Le Wrapper class trasformano i tipi primitivi in oggetti. Sono necessarie per usare tipi primitivi nelle Collections (che accettano solo oggetti).
Primitivo
Wrapper
Metodo utile
int
Integer
Integer.parseInt("42")
double
Double
Double.parseDouble("3.14")
boolean
Boolean
Boolean.parseBoolean("true")
char
Character
Character.isLetter('a')
long
Long
Long.MAX_VALUE
Autoboxing e unboxing
Generics
I Generics permettono di scrivere classi e metodi che funzionano con qualsiasi tipo, garantendo la sicurezza a compile-time senza cast espliciti.
Esempio
Annotazioni (Annotations)
Le annotazioni forniscono metadati al compilatore o al runtime. Le più usate sono predefinite in Java.
Annotazione
Uso
@Override
Indica che un metodo sovrascrive quello della superclasse
@Deprecated
Segna un metodo/classe come obsoleto
@SuppressWarnings
Sopprime avvisi del compilatore
@FunctionalInterface
Indica un'interfaccia con un solo metodo astratto
@SafeVarargs
Sopprime avvisi per varargs generici
Esempio @Override
Espressioni regolari (RegEx)
Le espressioni regolari (regex) sono pattern per trovare, validare e manipolare testo. In Java si usa il package java.util.regex.
Esempio
Thread (Programmazione concorrente)
Un thread è un flusso di esecuzione indipendente. Java supporta la programmazione multi-thread nativamente, permettendo di eseguire più compiti in parallelo.
Esempio
💡 In alternativa a extends Thread, implementa Runnable e passalo a un Thread: più flessibile perché non blocca l'ereditarietà.
Lambda (Java 8+)
Le espressioni lambda sono funzioni anonime compatte, usate principalmente con interfacce funzionali e le API Stream.
Esempi reali e completi per consolidare la programmazione Java con OOP e strutture dati.
Gestione rubrica con HashMap
Rubrica
Calcolo della media con ArrayList
Media voti
Editor online Java
Usa l'editor qui sotto per scrivere e leggere codice Java con la sintassi colorata. Per eseguirlo installa il JDK e lancia javac NomeFile.java && java NomeFile.
Il tuo codice Java
Quiz Java — metti alla prova le tue conoscenze
Rispondi mentalmente a queste domande e poi espandi la risposta per verificare.
Qual è la differenza tra == e .equals() in Java? Risposta:== confronta i riferimenti (indirizzi in memoria); .equals() confronta il contenuto. Per le stringhe usa sempre .equals().
Cosa succede se non si chiama super() in un costruttore figlio? Risposta: Java lo chiama automaticamente se la superclasse ha un costruttore senza argomenti. Altrimenti è necessario chiamarlo esplicitamente.
Qual è la differenza tra ArrayList e LinkedList? Risposta:ArrayList usa un array dinamico (accesso casuale O(1), inserimento in mezzo O(n)); LinkedList usa nodi collegati (inserimento in testa/coda O(1), accesso casuale O(n)).
Cosa significa static? Risposta: Un membro static appartiene alla classe, non alle singole istanze. È condiviso tra tutti gli oggetti e si accede tramite il nome della classe.
Quando si usa un'interfaccia invece di una classe astratta? Risposta: Si usa l'interfaccia quando si vogliono definire comportamenti da condividere tra classi non correlate. Una classe può implementare più interfacce ma estendere solo una classe.
Esercizi Java con soluzioni
Cinque esercizi pratici con soluzione completa commentata. Prova da solo prima di leggere la soluzione!
Esercizio 1 — Numeri pari tra 1 e 100
Soluzione
Esercizio 2 — Verifica numero primo
Soluzione
Esercizio 3 — Classe Studente con media
Soluzione
Esercizio 4 — Inversione di una stringa
Soluzione
Esercizio 5 — Stack con LinkedList
Soluzione
Sfide Java
Mettiti alla prova con queste sfide di crescente difficoltà:
🟢 Scrivi un programma che calcola il massimo comune divisore (MCD) di due numeri con l'algoritmo di Euclide.
🟡 Implementa una lista doppiamente collegata con metodi per aggiungere, rimuovere e stampare tutti i nodi.
🟡 Crea una classe Libreria che gestisce libri (aggiungi, rimuovi, cerca per autore) usando ArrayList.
🔴 Implementa un albero binario di ricerca (BST) con metodi di inserimento e visita in-order.
🔴 Scrivi un programma che usa i thread per simulare produttore-consumatore con una coda condivisa.
Progetti pratici con Java
Progetti reali per consolidare le competenze Java e arricchire il portfolio:
📱 Gestione biblioteca: CRUD per libri/utenti con file CSV come persistenza
🧮 Calcolatrice scientifica: con interfaccia grafica usando Java Swing
🎮 Gioco Tris: implementazione testuale di tic-tac-toe con AI minimax
📊 Analisi dati CSV: leggi file CSV, calcola statistiche, ordina e filtra
🌐 Client HTTP: scarica pagine web con HttpURLConnection e analizza il contenuto
🏦 Banca OOP: sistema bancario completo con account, transazioni, eredità
Programma completo del corso Java
Struttura modulare del corso, ideale per scuola superiore e autodidatti:
Le domande Java più frequenti in colloqui tecnici e selezioni universitarie:
💬 Spiega il principio SOLID. — Cinque principi di buona progettazione OOP: Single Responsibility, Open/Closed, Liskov Substitution, Interface Segregation, Dependency Inversion.
💬 Cosa è il garbage collector? — Processo JVM che libera automaticamente la memoria non più referenziata.
💬 Differenza tra HashMap e Hashtable? — HashMap non è sincronizzata (più veloce), Hashtable è thread-safe ma obsoleta. Per concorrenza usa ConcurrentHashMap.
💬 Cos'è il pattern Singleton? — Garantisce che una classe abbia una sola istanza. Si implementa con costruttore privato e metodo statico getInstance().
💬 Cosa sono le Stream API? — Introdotte in Java 8, permettono operazioni funzionali (filter, map, reduce) su collezioni in modo fluente e leggibile.
💬 Differenza tra abstract class e interface? — La classe astratta può avere stato e implementazioni parziali; l'interfaccia definisce solo contratti (da Java 8 può avere metodi default). Una classe estende una sola classe ma implementa più interfacce.
Bootcamp Java intensivo (2 settimane)
Piano accelerato per chi vuole padroneggiare Java rapidamente. 4-5 ore al giorno.
📌 Java è il linguaggio più richiesto nelle aziende italiane per backend enterprise. Padroneggiarlo apre le porte a ruoli da Java Developer, Android Developer e Software Engineer.
Riferimento — Parole chiave Java
Keyword
Uso
class
Definisce una classe
interface
Definisce un'interfaccia
extends
Ereditarietà (classe)
implements
Implementa un'interfaccia
abstract
Classe o metodo astratto
static
Membro di classe (non di istanza)
final
Costante / classe non ereditabile
private / public / protected
Modificatori d'accesso
new
Crea un nuovo oggetto
this
Riferimento all'istanza corrente
super
Riferimento alla superclasse
return
Restituisce un valore dal metodo
void
Metodo senza valore di ritorno
try / catch / finally
Gestione eccezioni
throw / throws
Lancia eccezioni
import
Importa classi da package
package
Raggruppa classi
enum
Tipo enumerazione
instanceof
Verifica il tipo di un oggetto
synchronized
Blocco thread-safe
Riferimento — Metodi String
Metodo
Descrizione
Esempio
length()
Lunghezza della stringa
"Java".length() → 4
charAt(i)
Carattere all'indice i
"Java".charAt(1) → 'a'
substring(a,b)
Sottostringa da a a b
"Java".substring(1,3) → "av"
toUpperCase()
Converte in maiuscolo
"java".toUpperCase() → "JAVA"
toLowerCase()
Converte in minuscolo
"JAVA".toLowerCase() → "java"
trim()
Rimuove spazi iniziali/finali
" ciao ".trim() → "ciao"
replace(a,b)
Sostituisce occorrenze
"ciao".replace("a","o") → "cioo"
contains(s)
Controlla se contiene s
"Java".contains("av") → true
startsWith(s)
Inizia con s?
"Java".startsWith("Ja") → true
endsWith(s)
Finisce con s?
"Java".endsWith("va") → true
indexOf(s)
Posizione prima occorrenza
"Java".indexOf("a") → 1
split(regex)
Divide in array
"a,b,c".split(",") → ["a","b","c"]
equals(s)
Confronto contenuto
"Java".equals("Java") → true
equalsIgnoreCase(s)
Confronto senza case
"java".equalsIgnoreCase("JAVA") → true
isEmpty()
Stringa vuota?
"".isEmpty() → true
toCharArray()
Converte in array di char
"hi".toCharArray() → ['h','i']
valueOf(x)
Converte in stringa
String.valueOf(42) → "42"
format()
Stringa formattata
String.format("%.2f", 3.14) → "3,14"
Riferimento — Metodi Math
Metodo
Descrizione
Esempio
Math.abs(x)
Valore assoluto
Math.abs(-5) → 5
Math.max(a,b)
Massimo tra a e b
Math.max(3,7) → 7
Math.min(a,b)
Minimo tra a e b
Math.min(3,7) → 3
Math.pow(b,e)
b elevato alla e
Math.pow(2,10) → 1024.0
Math.sqrt(x)
Radice quadrata
Math.sqrt(16) → 4.0
Math.round(x)
Arrotonda all'intero più vicino
Math.round(3.7) → 4
Math.floor(x)
Arrotonda per difetto
Math.floor(3.9) → 3.0
Math.ceil(x)
Arrotonda per eccesso
Math.ceil(3.1) → 4.0
Math.random()
Numero casuale [0.0, 1.0)
Math.random() → es. 0.42
Math.PI
π ≈ 3.14159
Math.PI * r * r
Math.log(x)
Logaritmo naturale
Math.log(Math.E) → 1.0
Math.sin/cos/tan(rad)
Funzioni trigonometriche
Math.sin(Math.PI/2) → 1.0
Riferimento — Collections API
Metodo
Descrizione
Collections.sort(list)
Ordina la lista in ordine naturale
Collections.sort(list, comp)
Ordina con comparatore personalizzato
Collections.reverse(list)
Inverte l'ordine degli elementi
Collections.shuffle(list)
Mescola casualmente
Collections.max(col)
Elemento massimo
Collections.min(col)
Elemento minimo
Collections.frequency(col, obj)
Conteggio di obj nella collezione
Collections.nCopies(n, obj)
Lista con n copie di obj
Collections.unmodifiableList(list)
Lista immutabile
Collections.synchronizedList(list)
Lista thread-safe
Arrays.asList(a, b, c)
Crea una lista da valori
Arrays.sort(arr)
Ordina array primitivo
Arrays.copyOf(arr, n)
Copia i primi n elementi
Arrays.fill(arr, v)
Riempie tutto l'array con v
Certificazione Java
Oracle offre certificazioni ufficiali Java molto apprezzate nel mercato del lavoro:
📖 Libri consigliati: OCP Java SE 17 Developer Complete Study Guide di Jeanne Boyarsky
🧪 Pratica con mock exam su Enthuware o Whizlabs
💻 Progetto reale con almeno 3 moduli OOP + Collections + I/O
⏱️ Tempo medio di preparazione: 3-4 mesi con 2 ore al giorno
Conclusione — E ora?
Hai completato il corso di Java! Hai imparato la sintassi, la programmazione a oggetti, la gestione degli errori, il file I/O, le Collections e le funzionalità moderne di Java (lambda, generics, thread). Sei pronto per costruire applicazioni reali.
E ora cosa fare?
💻 Installa IntelliJ IDEA Community (gratuito) — il miglior IDE per Java
🐙 Carica i tuoi progetti su GitHub — fondamentale per il portfolio
🌐 Studia Spring Boot — il framework Java più usato per web API
📱 Prova Android Studio — sviluppa app Android con Java/Kotlin
🎯 Affronta la certificazione OCA/OCP — riconosciuta dalle aziende
📖 Leggi Effective Java di Joshua Bloch — la bibbia del Java avanzato
🎯 La tua sfida finale
Realizza una classe ContoBancario con metodi per versare, prelevare (senza andare in rosso) e visualizzare il saldo. Usa ArrayList per registrare tutte le transazioni con data e importo. Poi crea due conti, simula operazioni e stampa l'estratto conto.