
Las colecciones proporcionan programación genérica para muchas estructuras de datos. Una colección es una agrupación de objetos relacionados que forma una única entidad, por ejemplo un arreglo de objetos, un conjunto… .El arreglo, el vector, la matriz, en general la Colección es en sí mismo otro objeto que se debe crear.
Ejemplo
class Pueblo{ . . . }
class Puerto{ . . . }
Pueblo []col1 = new Pueblo[100];
LinkedList <String> conCad = new LinkedList <String>(); // lista de cadenas
Las colecciones incluyen clases contenedoras para almacenar objetos, para acceder a los objetos en el interior de los contenedores y algoritmos para manipular los objetos (métodos de clases). Las clases Colección guardan objetos de cualquier tipo, de hecho el elemento base es Object y por consiguiente, debido a conversión automática, se podrá añadir a la colección un objeto de cualquier tipo. En el siguiente ejemplo crea una colección básica, secuencial, con un arreglo, para guardar objetos de diferentes tipos.
Ejemplo
Considerar una aplicación en la que se debe almacenar N objetos del tipo Punto2D, Punto3D y PuntoPolar. Se realiza un almacenamiento secuencial, para ello se declara un arreglo de tipo Object. De esa forma se puede asignar cualquier objeto. El problema surge al recuperar los elementos del arreglo, se hace un cast al tipo clase, que puede ser Punto2D, Punto3D y PuntoPolar.
class Pueblo{ . . . }
class Puerto{ . . . }
class PuntoPolar{ . . . }
Declaración y creación del array de N elementos:
final int N = 99;
Object []rr = new Object[N];
int i=0;
Asignación secuencial de objetos:
mas = true;
while(mas&&(i<N)){
int opc;
opc = menu();
if(opc == 1)
rr[i++] = new Punto2D();
else if(opc == 2)
rr[i++] = new Punto3D();
if(opc == 3)
rr[i++] = new PuntoPolar();
else
mas = false;
}
Asignar elementos en un arreglo es una operación muy eficiente. Una de las limitaciones de los arreglos es el tamaño; al ser de tamaño fijo, si se llena hay que ampliarlo. Por contra, una característica importante de las clases Colección es que se redimensionan automáticamente, el programador se despreocupa de controlar el número de elementos, puede colocar tantos elementos como sea necesario.
Norma
Cuando se vaya a trabajar con tipos de datos simples, o cuando se conozca el tipo de dato de los elementos y el tamaño final, resulta muy eficiente utilizar arreglos (arrays). En cualquier otro caso, será conveniente utilizar alguna de las colecciones del paquete java.util. (Ver arreglos unidimensionales)
Tipos de colecciones
En las primeras versiones del JDK, Java 1.0 y 1.1, se incorporan colecciones básicas, aunque en la mayoría de las ocasiones son suficientes. Las más importantes son Vector, Stack, Dictionary, HashTable y la interfaz Enumeration para recorrer los elementos de una colección.
Algunos componentes de la jerarquía de colecciones.

Java 2 (versiones 1.2 y posteriores) incorpora nuevas clases colección, dentro del paquete java.util (API de las colecciones). Hay tres tipos de generales de colecciones: conjuntos, listas y mapas; las interfaces Set, List y Map describen las características generales de estas. Además, la interfaz Collection especifica el comportamiento común de las colecciones. El diseño de estas colecciones tuvo muy en cuenta los problemas de seguridad que pudieran surgir en la ejecución de múltiples tareas. De tal forma que si varios hilos acceden a una de estas estructuras se garantiza que los accesos están sincronizados, es decir que hasta que un hilo no termina de procesar los elementos de una colección no hay otro hilo que procese la misma colección. El problema de todo esto es que ralentiza la ejecución de la aplicación, además, aun cuando no sean necesario los comportamientos sincronizados, no hay forma de desactivar las comprobaciones de sincronización. A continuación se escribe la declaración de métodos de la clase Stack, todos ellos con el comportamiento de sincronización.
public synchronized int size()
public synchronized boolean isEmpty()
public synchronized boolean contains(Object elemento)
public synchronized Object put(Object clave, Object valor)
public synchronized Object remove(Object clave)
Las nuevas clases Colección, añadidas en Java 2, se han diseñado sin el comportamiento de sincronización, al menos directamente. Por ejemplo, obsérvese la siguiente declaración de métodos de la colección ArrayList:
public int size()
public boolean isEmpty()
public boolean contains(Object elemento)
public Object get(int index)
public Object set(int index, Object elemento)
public boolean add(Object elemento)
public Object remove(int index)
Ahora bien, hay aplicaciones en las que interesa proteger a una colección de modificaciones simultáneas por más de un hilo (Thread). Entonces, para añadir la cualidad de sincronización a las colecciones Java 2 dispone de un mecanismo que dota de ese comportamiento a una colección. Esto está implementado mediante métodos static de la clase Collections, por ejemplo:
ArrayList vd = new ArrayList();
A continuación se le dota de sincronización.
vd = Collections.synchronizedList(vd);
Para un mapa el método Collections.synchronizedMap(), para un conjunto Collections.synchronizedSortedSet(); y así para otras colecciones.