Sommario
< Home
Stampa

Classi della libreria Java

La libreria standard Java contiene un insieme di classi utili nelle applicazioni. Vediamo quelle più importanti.

Classi wrapper

Nella lezione precedente abbiamo introdotto i tipi base. I tipi base non sono oggetti, sono semplici contenitori di valori. Java permette però di usare degli oggetti che corrispondono ai tipi base, ma sono veri e propri oggetti detti Wrapper (“contenitori”):

Tipo baseWrapper
intInteger
floatFloat
doubleDouble
charChar
booleanBoolean

Gli oggetti Wrapper:

  • non hanno bisogno della parola chiave new. E’ quindi possibile assegnare come ad esempio Integer i = 0;
    La parola chiave new non è necessaria, ma è sempre possibile usarla.
  • si comportano come tipi riferimento e non come tipi valore.
  • siccome stanno nello Heap sono sempre preferibili quando si usano all’interno di liste di oggetti, come gli array (che vedremo qui sotto).

Array

Un Array è una classe che rappresenta una lista di variabili dello stesso tipo. Vediamo qualche esempio di dichiarazione:

float[] lista = new float[10]; // dichiara un array di 10 elementi con valore 0 di default;
Persona[] persone = new Persona[10]; // crea un array di 10 oggetti di tipo Persona
Integer[] elementi = {1,2,3,4,5}; // dichiarazione tramite literal
int matrix[][] = new int[6][8]; // matrice bidimensionale.

Come si vede la coppia di parentesi quadre davanti al tipo di dato lo definisce come array. Possiamo definire un array multidimensionale aggiungendo altre coppie di parentesi.

Per istanziarlo possiamo darne o la dimensione o indicare con un literal direttamente i valori. Se dichiariamo un array di tipo oggetto, gli oggetti non sono automaticamente instanziati. Non è possibile modificare la dimensione di un array dopo averlo creato.

persone[0] = new Persona("Mario", "Rossi");
persone[0].print();

for (int i=0; i<lista.length; i++) {
  System.out.println(lista[i]);
}

for (int i : lista) {
   System.out.println(i);
}
  • La proprietà length indica la dimensione.
  • il costruto for (elemento : array) { … } permette di scorrere gli elementi di un array

La libreria java.util.Arrays fornisce un insieme di funzioni utili per lavorare sugli array. Vediamo un esempio completo:

import java.util.Arrays;

public class ArrayApplication {

    public static void main(String[] args) {
        int[] lista = {9,4,2,5,1,8,6};
        Arrays.sort(lista);
        System.out.println("Lista: " + Arrays.toString(lista));
        int indice = Arrays.binarySearch(lista, 2);
        System.out.println(indice);
        int[] copia = Arrays.copyOf(lista, lista.length);
        System.out.println("Copia: " + Arrays.toString(copia));
        boolean uguali = Arrays.equals(lista, copia);
        System.out.println(uguali);
    }
}

Riassumendo:

  • sort() ordina un array
  • toString() stampa l’array in modo gradevole
  • binarySearch(array, elemento) restituisce l’indice dell’elemento se trovato, valore negativo altrimenti
  • copyOf(array, numero elementi) crea una deep copy dell’array
  • equals(array1, array2) confronta tutti gli elementi uno per uno e restituisce un booleano

Stringhe

Le stringhe rappresentano un gruppo di caratteri e si usano per rappresentare il testo. Sono un tipo di dati particolare per le seguenti ragioni che vediamo con qualche esempio:

        String s1 = "ciao";
        System.out.println(s1);
        String s2 = s1;
        System.out.println("Lunghezza: "+ s1.length());
        System.out.println(s1.charAt(2));
        System.out.println(s1.concat(s2));
        s1 = "Ciao Mario";
        System.out.println(s1.substring(5));
        System.out.println(s1.substring(0, 4));
        String[] chars = s1.split("");
  • sono oggetti, ma per essere creati non hanno bisogno della parola chiave new String, è sufficiente assegnarli come un literal. La parola chiave new è comunque possibile.
  • Analogamente si possono stampare direttamente con System.out.println per esempio.
  • La copia di una stringa (assegnazione) produce una nuova stringa identica, è quindi una deep copy.
  • E’ possibile avere la lunghezza con length().
  • Si accede al singolo caratter con charAt().
  • Si possono concatenare due stringhe con concat(stringa1, stringa2).
  • SI può ottenere una nuova stringa con concat(inizio) oppure concat(inizio, fine).
  • Si può creare anche un array di char con split(carattere separatore).

Funzioni matematiche

Qui un elenco di funzioni matematiche:

MetodoDescrizioneEsempio
Math.abs(x)Valore assolutoMath.abs(-5) → 5
Math.max(a, b)Valore massimo tra due numeriMath.max(3, 7) → 7
Math.min(a, b)Valore minimo tra due numeriMath.min(3, 7) → 3
Math.pow(a, b)Potenza: a elevato alla bMath.pow(2, 3) → 8.0
Math.sqrt(x)Radice quadrataMath.sqrt(9) → 3.0
Math.round(x)Arrotonda al numero intero più vicinoMath.round(3.6) → 4
Math.floor(x)Arrotonda per difettoMath.floor(3.9) → 3.0
Math.ceil(x)Arrotonda per eccessoMath.ceil(3.1) → 4.0

e trigonometriche:

MetodoDescrizioneEsempio
Math.sin(x)Seno (x in radianti)Math.sin(Math.PI / 2)
Math.cos(x)CosenoMath.cos(0)
Math.tan(x)TangenteMath.tan(Math.PI / 4)
Math.asin(x)Arco-seno (risultato in radianti)Math.asin(1)
Math.acos(x)Arco-cosenoMath.acos(0)
Math.atan(x)Arco-tangenteMath.atan(1)
Math.toRadians(gradi)Converte gradi in radiantiMath.toRadians(180)
Math.toDegrees(radianti)Converte radianti in gradiMath.toDegrees(Math.PI)

I numeri random si generano così:

float valore = Math.random(); // valore tra 0 e 1

Date

Java supporta le date con un insieme di classi apposite. Vediamo gli esempi:

import java.time.*;;
...

LocalDate oggi = LocalDate.now();              // Data corrente
LocalDate dataSpecifica = LocalDate.of(2025, 7, 15);
LocalDateTime adesso = LocalDateTime.now();
LocalDateTime dataOra = LocalDateTime.of(2025, 7, 15, 14, 30);

LocalDate domani = oggi.plusDays(1);
LocalDate settimanaProssima = oggi.plusWeeks(1);
LocalDate ieri = oggi.minusDays(1);

if (dataSpecifica.isBefore(oggi)) {
    System.out.println("La data è nel passato");
}

Come si può vedere:

  • LocalDate e LocalDateTime indicano rispettivamente data senza ora e data con ora.
  • E’ possibile creare la data dall’istante attuale o passando anno, mese, giorno, ora e minuto.
  • Si possono sommare ore, minuti, giorni, settimane, mesi ed anni ad una data.
  • E’ possibile confrontare date.

Si può anche generare una data da una stringa:

DateTimeFormatter formatter = DateTimeFormatter.ofPattern("dd/MM/yyyy");
String dataFormattata = oggi.format(formatter);  // "15/07/2025"

LocalDate parsed = LocalDate.parse("31/12/2025", formatter);

Input ed output

Input con Scanner

Come già visto per eseguire l’output si usa la funzione System.out.println (o print se non si vuole andare a capo).

System.out.println("Ciao");
System.out.print("Ciao") // in questo caso non va a capo;

Facciamo un esempio eseguibile:

import java.util.Scanner;
    
public class InputApplication {
    public static void main(String[] args) {
        
        Scanner input = new Scanner(System.in);
        System.out.print("Inserisci a: ");
        int a = input.nextInt();
        System.out.print("Inserisci b: ");
        int b = input.nextInt();
        int c = a + b;
        System.out.println("La somma è: " + c);
        input.close();

    }
}

Cose da osservare:

  • importare la classe Scanner;
  • bisogna istanziare un oggetto della classe Scanner;
  • scanner contiene un metodo per ogni tipo di dato (nextInt, nextString, ecc.);
  • al termine bisogna chiudere l’input (metodo close() ).

File

Per eseguire la scrittura di un file di testo esistono numerose classi, per le nostre lezioni useremo PrintWriter.

PrintWriter pw = new PrintWriter("file.txt");
pw.println("Questo è un testo di prova");
pw.close();

Per eseguire la lettura invece si può usare Scanner, questa volta per leggere da file.

Scanner file = new Scanner(new File("file.txt"));
while (file.hasNextLine()) {
    System.out.println(file.nextLine());
 }
 file.close();

Costrutti

For con array

Java prevede un for specifico per tutte le liste di dati, come gli array. La struttura la vediamo nel seguente esempio:

int[] numeri = {10, 20, 30, 40, 50};
int somma = 0;

for (int numero : numeri) {
  somma += num;
}

Exception e try-catch-finally

Quando si manipolano funzioni di libreria, si utilizzano strumenti che sono fuori dal controllo del flusso di programma, ad esempio quando si apre un file si accede ad una risorsa di sistema operativo. Questo può comportare errori a runtime non gestibili nell’algoritmo dell’applicazione. Questo tipo di eventi viene considerato eccezionale, perché fuori dal controllo del programma, e sono gestiti da Java tramite la creazione di eccezioni (oggetti della classe Exception).

Quando viene emessa una eccezione, il flusso del programma si interrompe e l’applicazione va in crash. Java però mette a disposizione un meccanismo per intercettare le eccezioni. Lo vediamo con esempio:

try {
  Scanner file = new Scanner(new File("file.txt")); 
  while (file.hasNextLine()) {
      System.out.println(file.nextLine());
   }
   file.close();
} catch (Exception e) {
   System.out.println("Questo blocco viene eseguito se viene individuata una eccezione");
} finally {
  System.out.println("Questo blocco viene eseguito comunque, con o senza eccezione")
};

Il blocco try viene eseguito ma tenuto sotto controllo. Se nell’esecuzione viene sollevata una eccezione (ad esempio file non esiste), viene eseguito il blocco catch. Infine c’è il blocco opzionale finally che viene eseguito comunque.