Framework Collection

Last Updated on 2 anni | Published: 25/05/2024

JFC - Java Framework Collection

Una collezione, contenitore, consente di gestire un gruppo di oggetti, Java fa  questo attraverso il suo JFC (Java Framework Collection)  che è una libreria formata da un insieme di interfacce e classi che si implementano per lavorare con un gruppo di oggetti (collezioni), il package dove queste risiedono è java.util

Il programmatore spesso ha bisogno di gestire dinamicamente queste strutture e quindi desidera aggiungere, rimuvere, ricercare e modificare i dati in esse contenuti, senza tenere conto della posizione in cui inserire il dato e nemmeno della lunghezza dell’ array, infatti non abbiamo limiti di oggetti e nemmeno specificare la cardinalità come i primitivi perche non esiste.

Queste strutture di raggruppamento vengono scelte dalle interfacce di alto livello che descrivono i tipi di base in un modo astratto  e poi si sceglie la classe che implementa il tipo di base, ovviamete prendendo in considerazione la velocità di esecuzione ed il consumo di memoria. Vediamo un grafico semplificato di Classi Collection attraverso un diagramma:

Fig-1

Tipologie di Collezioni

  Collection<E>() 

E’ l’ interfaccia piu generica, non definisce  nè l’ ordine in cui sono memorizzati gli elementi nè se ci possono essere elementi duplicati. I metodi di una Collection sono:

  List<E>() 

Corrisponde ad un gruppo di oggetti in cui si possono avere elementi duplicati, in questo caso gli oggetti generalmente sono mantenuti in ordine di inserimento 

Una lista assegna un indice ad ogni elemento inserito e li mantiene, per cui è possibile inserire, rimuovere, modificare, leggere elementi

List è l’ interfaccia di base per tutti i tipi di liste, ArrayList e LinkedList

  ArrayList<E>()  

La classe ArrayList implementa l’ Interfaccia List ed è un Array che non possiede una lunghezza fissa quindi può crescere e rimpicciolirsi diamicamente con l’ aggiunta e la rimozione di elementi al suo interno, si possono avere elementi duplicati e mantiene l’ ordine in cui sono stati inseriti gli oggetti. Un ArrayList quindi lavora in questo modo: quando un elemento viene aggiunto se non vi è più spazio, viene creato un nuovo array più grande per sostituire quello vecchio.

Un ArrayList viene creato in base al suo contenuto, quindi ha un tipo, che nell’ esempio potrebbe essere un Integer. Vediamo quindi come si dichiara ed istanzia un ArrayList:

Il tipo è inserito tra le parentesi angolari  può essere qualsiasi classe Wrapper e  non solo. Potrermmo utilizzare la classe Object e dimostare che la collezione può contenere qualsiasi oggetto di tipo Wrapper.

Tra i metodi che l’ interfaccia Collection mette a disposizione anche per l’ ArrayList c’è quello per aggiungere elementi e cioè add :

I metodi che le collection espongono attraverso i loro oggetti sono diverse decine, ma una buona parte vengono ereditati da interfacce, come si può notare dal grafico iniziale, e poi implementati secondo il loro utilizzo. Questo lo si evince istanziando un ArrayList tenendo condo che List e Collection sono le interfacce da cui esso deriva, vediamo un esempio di istanze differenti:

Da questo si può notare che un ArrayList di tipo Collection ha tutti i metodi base, mentre quello di tipo List possiede anche altri metodi, come ad esempio inserire un elemento in una specifica posizione, inoltre è importante ricordare che tutte le collection possono essere solo di tipo classe come ad esempio Integer e tutte le Wrapper.

  LinkedList<E>()  

LinkedList è una classe molto simile ad ArrayList, ha gli stessi metodi, gli elementi al suo interno rispettano l’ ordine con cui sono stati inseriti, ammette duplicati ma lavora in modo differente da un ArrayList, infatti gli elementi sono posizionati in contenitori che si collegano al precedente e successivo e quando sarà necessario inserire nuovi oggetti questi verranno collocati prima in un contenitore che a sua volta avrà un collegamento con il contenitore precedente e successivo ed in questo modo l’ array risulta essere dinamico per effetto di liste collegate.

LinkedList fornisce diversi metodi per eseguire determinate operazioni in modo più efficiente, ad esempio come accedere ad elementi casuali:

  • addFirst(Elemento)
    • Aggiunge un elemento all’ inizio della lista.
  • addLast(Elemento)
    • Aggiunge un elemento in fondo alla lista
  • removeFirst(Elemento)
    • Rimuove il primo elemento della lista
  • removeLast(Elemento)
    • Rimuove l’ ultimo elemento della lista
  • getFirst(Elemento)
    • Per ottenere il primo elemento della lista
  • getLast(Elemento)
    • Per ottenere l’ ultimo elemento della lista

ArrayList e Classi JavaBean

Come abbiamo detto in precedenza le JFC (Java Framework Collection) lavorano tutte con gruppi di oggetti tra cui anche le classi Wrapper. A tal proposito vogliamo mostrare un semplice esempio di come è possibile gestire le collection, ad esempio ArrayList<E>, con classi JavaBean.

Fig-2
Fig-3

Nella classe BeanStudenti (Fig-3) possiamo notare la presenza del costruttore con parametri, infatti nel Test (Fig-4 riga 12 e 15) vengono creati due oggetti BeanStudenti per poi essere aggiunti all’ ArrayList dichiarato ed assegnato alla riga 10  (Fig-4) mentre alla riga 14 e 16 vengono automaticamente aggiunti in coda all’ array. 

  Set<E>()  

Con questo tipo di collection si possono gestire insiemi di oggetti in cui non saranno presenti elementi duplicati e come mostrato nel grafico di Fig-1 l’ Interfaccia Set è ereditata anche da TreeSet ed HashSet che tratteremo in questo articolo.

  HashSet<E>()  

Classe concreata che eredita l’ interfaccia Set, non consente elementi duplicati, non mantiene l’ ordine di inserimento e consente valori null. Questa comparazione è immediatamente dimostrabile con le classi Wrapper.

Un esempio molto simile può essere realizzato utilizzando la classe String invece che Integer ottenendo così un insieme che non rispetta l’ ordine di inserimento e non è ordinato.

  TreeSet<E>()  

Classe concreta che eredita l’ interfaccia Set, non consente la duplicazione di elementi,  non rispetta l’ ordine di inserimento,  non consente elementi null ma restituisce, come nel caso di oggetti String, un insieme con un ordinamento naturale.

Vediamo come la classe Test gestisce questa collection:

Comparazione degli Oggetti

L’ interfaccia Comparable viene utilizzata per definire un ordine naturale tra gli oggetti di una classe. Quando una classe implementa l’interfaccia Comparable, deve fornire un’implementazione del metodo compareTo(), che confronta l’oggetto corrente con un altro oggetto dello stesso tipo e restituisce un valore intero che indica l’ordine relativo tra i due oggetti.

Immaginiamo di avere una classe Auto che rappresenta un’automobile e ha le seguenti proprietà: targa, marca e modello, ciascuna con il proprio getter e setter.

Per consentire la comparazione tra oggetti Auto, la classe Auto dovrebbe implementare l’interfaccia Comparable e fornire un’implementazione del metodo compareTo().

Nell’esempio sopra, la classe Auto implementa l’interfaccia Comparable specificando Comparable<Auto>. Ciò significa che stiamo implementando la comparazione per gli oggetti Auto. Considerando che la targa è un attributo di tipo int, l’ algoritmo implementato nel metodo compareTo(Auto o) restituisce 1 oppure -1 per avere un ordinamento crescente oppure decrescente tra gli oggetti in riferimento alla targa, mentre se restituisce 0 nel nostro esempio è una targa già esistente per cui l’ oggetto non verrà inserito per una logica della collezione stessa.

  Interfaccia Queue  

La Queue è una interfaccia che estende l’ interfaccia Collection (Fig-1) il cui scopo è quello di gestire gli elementi in ordine FIFO (First In First Out), significa che l’ ultimo elemento della lista è il primo ad uscire. Ovviamente per creare oggetti di tipo coda sono necessarie classi concrete come PriorityQueue oppure LinkedList. Possiamo elencare quali sono i metodi più comuni:

  • add(obj)
    • Aggiunge un elemento alla coda e ritorna true oppure false.
  • offer(obj)
    • Aggiunge un elemento senza alcun valore di ritorno.
  • pull()
    • Cerca e Rimuone il primo elemento della coda ritornando null se la coda è vuota.
  • remove()
    • Cerca e Rimuove il primo elemento della coda, genera una eccezione se la coda è vuota.
  • peek()
    • Cerca e non Rimuove il primo elemento della lista, restituisce null se la coda è vuota.
  • element()
    • Cerca e non Rimuove il primo elemento della lista, genera una eccezione se la coda è vuota.

Il progetto seguente mostra l’ utilizzo dell’ interfaccia Queue per creare una coda di oggetti attraverso un’ istanza della classe concreta LinkedList:

Lascia un commento

Il tuo indirizzo email non sarà pubblicato. I campi obbligatori sono contrassegnati *