Java: Non solo List e Map

INTRODUZIONE

Java è un linguaggio di programmazione vecchio di 21 anni e nonostante ciò è sempre presente tra le principali classifiche del settore. Possiamo dire quindi che Java, grazie anche alle sue varie sfaccettature, non passa mai di moda!

Inoltre, notizia di qualche mese fa, Oracle ha deciso di rilasciarne una nuova versione ogni 6 mesi. 

Un pò troppo visto i trascorsi del linguaggio... vedremo!

Durante questi anni, i creatori di Java hanno messo a disposizione molte classi con funzionalità native che la maggior parte degli sviluppatori non conosce o non utilizza!

Vediamo di farne una veloce rassegna

LIST

Quando un programmatore pensa ad un elenco di record pensa ad un array o meglio, una lista!

Vediamo le implementazioni più conosciute ArrayList e LinkedList passando poi tra le altre (vedi java doc ver 8

ArrayList

Costruita su un array (inizialmente di 10 elementi) è la struttura dati più utilizzata non sapendo che a il 90% delle volte è più performante utilizzare LinkedList appunto perchè ArrayList viene inizializzata con una size predefinita e se occorre avere più spazio viene copiato e creato un nuovo array (per i più curiosi andate a sbirciare il sorgente di java e cercate la funzione grow dove troverete un bel Arrays.copyOf)

LinkedList

A differenza di ArrayList, è costruita con un paradigma a "puntatori" (quindi molto più veloce e flessibile di ArrayList) 
Se dobbiamo iterare una lista di valori conviene usare questa struttura dati ma se devo invece accedere ad un determinato elemento è un bel problema perchè occorrerà visitare l'intera struttura sequenzialmente (per i più curiosi andate a sbirciare il sorgente di java e cercate la funzione node dove troverete un bel ciclo for)

AttributeList, RoleList e UnresolvedRoleList

Implementazione speciale per la gestione degli Attribute e dei Ruoli di un MBeanServer e MBeanServerConnection. Tutte e tre le implementazioni estendono la classe ArrayList

CopyOnWriteArrayList

Usato per lo più per evitare il tipico errore di concurrent modification dato che viene effettuata una copia dell'intera struttura ogni qualvolta che viene effettuata una scrittura

Vector

Un Vettore in Java è uno speciale Array che può essere ridimensionato in maniera più efficiente rispetto all'implementazione tipica

Stack

Questa classe è una tipica struttura LIFO (Last In First Out) costruita estendendo la classe Vector 

MAP

La mappa è tipicamente una struttura chiave / valore. La più comune è l'HashMap ma occorre dare la giusta attenzione a tutte le altre

Attributes

Mappa dedicata alla gestione degli attributi indicati in un file MANIFEST tipicamente utilizzato in ogni file jar.

ConcurrentHashMap

Questa struttura dati è stata costruita appositamente per gestire un alto rate di scrittura. Dovendo gestire quindi la sicurezza a livello di thread le scritture provocano un lock del dato (cosa che non avviene in lettura)

ConcurrentSkipListMap

Creata tramite l'implementazione di una SkipList la mappa è ordinata tramite un ordine naturale oppure tramite un Comparator. Come intuibile dal nome anch'essa è thread-safe

Hashtable

Funziona principalmente tramite l'hash restituito dalla funzione hashCode() dell'oggetto key. Inoltre è una struttura thread-safe ma molto più lenta della più classica HashMap

TreeMap

Sviluppata sopra la struttura degli alberi rosso-neri garantisce un accesso molto performante sia per il recupero delle informazioni tramite chiave sia per le tipiche operazioni di aggiungi/rimuovi. Purtroppo questa struttura non è syncronized quindi occorre gestire esternamente un potenziale accesso in concorrenza

WeakHashMap

Questa implementazione ha una caratteristica unica rispetto alle altre: gestisce eventuali distruzioni dei dati se l'hash della mappa non viene più utilizzata. Questo avviene quando non esiste un singolo riferimento che punta a quella chiave. Quando quindi il garbage collection (GC) scarta una chiave, la sua voce viene effettivamente rimossa dalla mappa.

Come vedere c'e' solo l'imbarazzo della scelta...

Alla prossima!

Spataro Fabrizio

Commenti

Post popolari in questo blog

Hadoop, how to create a single node cluster using docker

How to install IOTA node with docker

Apache Spark - Try it using docker!