La funzionalità di "formattazione" delle stringhe è stata introdotta a partire da Java 5 e sfrutta, tra le altre cose, anche un'altra feature di Java 5 che sono i metodi "varargs" (metodi con numero variabile di argomenti). format/printf sono appunto metodi varargs, cioè accettano un numero arbitrario di argomenti.
Il metodo format è stato aggiunto in diverse classi: String, PrintStream, PrintWriter, Console (introdotta da Java 6) e java.util.Formatter che è la classe che fa da "motore" per la formattazione delle stringhe (usata "dietro le quinte" dalle altre classi citate).
In alcune classi es. PrintStream/PrintWriter/Console è stato aggiunto anche printf. Banalmente printf fa nient'altro che invocare direttamente format, passando tutto pari-pari. printf è stato aggiunto più che altro per rendere più "amichevole" la cosa a chi proviene dal "C", dove printf è la più conosciuta e principale funzione di I/O della libreria standard del C.
format/printf riceve un String che è la stringa di formato e poi un numero arbitrario di oggetti. Si possono anche passare tipi primitivi, che vengono automaticamente convertiti nel corrispondente oggetto della classe wrapper (es. int -> Integer), tramite autoboxing.
La stringa di formato può contenere testo normale ma anche dei particolari specificatori di formato che hanno un significato speciale e permettono di formattare un valore in modo più specifico.
codice:
String nome = "Mario";
String cognome = "Rossi";
int numAutomobili = 3;
String msg = String.format("La persona %s %s ha il seguente num. di automobili: %d", nome, cognome, numAutomobili);
Dove %s indica un argomento da inserire come stringa mentre %d indica un valore intero stampato in base 10 (decimale).
In msg c'è la stringa "La persona Mario Rossi ha il seguente num. di automobili: 3". Tecnicamente sarebbe uguale a fare, con la concatenazione delle stringhe:
codice:
String msg = "La persona " + nome + " " + cognome + " ha il seguente num. di automobili: " + numAutomobili;
che tra l'altro è anche un pelino più corta di quella con il format. Ma la vera potenzialità della formattazione è che è possibile utilizzare flag particolari negli specificatori di formato per gestire padding, zeri iniziali e altro.
codice:
String msg = String.format("La persona %s %s ha il seguente num. di automobili: %04d", nome, cognome, numAutomobili);
Il risultato è: "La persona Mario Rossi ha il seguente num. di automobili: 0003"
%04d vuol dire: formatta il valore intero mettendo zeri iniziali per avere almeno, come minimo, 4 cifre.
Fare questo con la classica concatenazione delle stringhe sarebbe più lungo/contorto, perché avresti bisogno di farti un metodo apposito che fornisce un String da un int applicando zeri iniziali (in quantità parametrabile) oppure di usare un metodo simile di una qualche libreria esterna.