Las colecciones en Java se concentran principalmente en dos partes, una en el paquete java.util y la otra en java.util.concurrent. La última se basa en la primera y define algunas colecciones que implementan funciones de sincronización.
Este artículo se centra principalmente en varios objetos de colección en java.util. Los objetos de colección en Java se pueden dividir aproximadamente en tres categorías: Lista, Conjunto y Mapa. El diagrama UML correspondiente es el siguiente (incluida la mayoría de los objetos de colección en java.util):
Resumen de la colección
Tanto List como Set en las colecciones de Java provienen de Collection. Es un buen punto de entrada para aprender sobre las colecciones. Incluye operaciones que generalmente se requieren en las colecciones:
Agregar elementos: agregar/addAll
Limpiar la colección: borrar
Eliminar elementos: eliminar/eliminar todo
Determinar si la colección contiene un elemento: contiene/contieneTodo
Determinar si la colección está vacía: isEmpty
Calcular el número de elementos de una colección: tamaño
Convertir una colección en una matriz: toArray
Obtener iterador: iterador
Veamos un ejemplo simple. El siguiente código devolverá una colección cuyos elementos son números enteros generados aleatoriamente:
recogida de devolución;
}
1) Utilice iteradores para recorrer la colección. Como se mencionó anteriormente al describir la interfaz de Colección, todas las colecciones tendrán un iterador que podemos usar para recorrer la colección.
La lista en Java es una extensión efectiva de la matriz. Es una estructura que puede contener elementos de cualquier tipo si no se utilizan genéricos. Si se utilizan genéricos, solo puede contener elementos del tipo especificado por los genéricos. En comparación con las matrices, la capacidad de List se puede ampliar dinámicamente.
Los elementos de la Lista se pueden repetir y los elementos del interior están "ordenados". Aquí "ordenado" no significa ordenar, sino que podemos especificar la posición de un elemento en la colección.
Los objetos de colección de uso común en List incluyen: ArrayList, Vector y LinkedList. Los dos primeros se almacenan en función de matrices y el último se almacena en función de listas vinculadas. Entre ellos, Vector es seguro para subprocesos y los otros dos no lo son.
La lista puede contener valores nulos, incluso si se utilizan genéricos.
ArrayList puede ser el objeto de colección más utilizado en el código de ejemplo anterior, también lo usamos para crear una instancia de un objeto de colección, por lo que no entraremos en detalles aquí.
Vector
Un ejemplo de Vector es el siguiente. Primero, veamos cómo generar y generar Vector:
[9, 29, 32, 54, 12]
el tamaño del vector es 3
[29, 32, 54]
LinkedList utiliza listas vinculadas para almacenar datos. Su código de muestra es el siguiente:
El resultado es el siguiente:
nulo
nulo
nulo
El tamaño de la lista enlazada es 8.
[100, 84, 19, 57, 68, 26, 27, 47]
Conjunto es similar a Lista, ambos se utilizan para almacenar un solo elemento y el número de elementos individuales es incierto. Pero Set no puede contener elementos duplicados. Si se insertan dos elementos idénticos en Set, el último elemento no se insertará.
El conjunto se puede dividir aproximadamente en dos categorías: conjunto sin clasificar y conjunto ordenado. El conjunto sin clasificar incluye HashSet y LinkedHashSet, y el conjunto ordenado se refiere principalmente a TreeSet. Entre ellos, HashSet y LinkedHashSet pueden contener nulos.
Conjunto de hash
HashSet es una colección respaldada por una tabla Hash, que no es segura para subprocesos.
Veamos el siguiente ejemplo, que es básicamente el mismo que el primer ejemplo con Vector:
para (int i = 0; i < 3; i++)
{
set.add(nuevo entero(100));
}
set.add(nulo);
System.out.println("el tamaño del conjunto es " + set.size());
System.out.println(conjunto);
}
claseMiEntero
{
valor entero privado;
público MyInteger (valor entero)
{
this.value = valor;
}
cadena pública a cadena ()
{
return String.valueOf(valor);
}
código hash int público()
{
devolver 1;
}
público booleano es igual (Objeto obj)
{
devolver verdadero;
}
}
El siguiente es el método de prueba correspondiente:
para (int i = 0; i < 3; i++)
{
set.add(new MyInteger(100));
}
System.out.println("el tamaño del conjunto es " + set.size());
System.out.println(conjunto);
}
TreeSet es un conjunto que admite la clasificación y su interfaz principal es SortedSet.
Primero echemos un vistazo a las operaciones básicas de TreeSet:
Aleatorio r = nuevo Aleatorio();
para (int i = 0; i < 5; i++)
{
set.add(new Integer(r.nextInt(100)));
}
System.out.println(conjunto);
System.out.println(set.first());
System.out.println(set.last());
System.out.println(set.descendingSet());
System.out.println(set.headSet(new Integer(50)));
System.out.println(set.tailSet(new Integer(50)));
System.out.println(set.subSet(30, 60));
System.out.println(set.floor(50));
System.out.println(set.techo(50));
}
[53, 49, 48, 42, 8]
[8, 42, 48, 49]
[53]
[42, 48, 49, 53]
A continuación, primero redefinimos Entero:
público MyInteger2 (valor int)
{
this.value = valor;
}
público int comparar con (objeto arg0)
{
MiEntero2 temp = (MiEntero2)arg0;
si (temp == nulo) devuelve -1;
si (valor.temp. > este.valor)
{
devolver 1;
}
de lo contrario si (valor.temp. <este.valor)
{
devolver -1;
}
devolver 0;
}
público booleano es igual (Objeto obj)
{
devolver comparar con (obj) == 0;
}
cadena pública a cadena ()
{
return String.valueOf(valor);
}
}
El mapa almacena "pares clave-valor". De manera similar a Set, hay dos tipos de mapas en Java: ordenados y sin clasificar incluyen HashMap, Hashtable y LinkedHashMap, y ordenados incluyen TreeMap.
Mapa sin clasificar
Tanto HashMap como Hashtable se almacenan en forma de tablas Hash. HashMap no es seguro para subprocesos, pero Hashtable sí lo es. Podemos considerar a HashMap como una versión "simplificada" de Hashtable.
HashMap puede almacenar valores nulos, ya sea para clave o valor. Hashtable no puede almacenar valores nulos.
Independientemente de HashMap o Hashtable, si observamos su constructor, encontraremos que puede tener dos parámetros: capacidad inicial y factor de carga. Por defecto, capacidad inicial es igual a 16 y factor de carga es igual a 0,75. Esto está relacionado con la cantidad de elementos que se pueden almacenar en la tabla Hash. Cuando la cantidad de elementos excede la capacidad inicial * loadFactor, se activará el método de repetición para expandir la tabla hash. Si necesitamos insertar demasiados elementos, debemos ajustar estos dos parámetros adecuadamente.
Primero veamos un ejemplo de HashMap:
map.put(nuevo entero(1), "a");
map.put(nuevo entero(2), "b");
map.put(nuevo entero(3), "c");
System.out.println(mapa);
System.out.println(map.entrySet());
System.out.println(map.keySet());
System.out.println(map.values());
}
map.put(nulo, nulo);
map.put(nulo, nulo);
map.put(nuevo entero(4), nulo);
map.put(nuevo entero(5), nulo);
System.out.println(mapa);
System.out.println(map.entrySet());
System.out.println(map.keySet());
System.out.println(map.values());
}
table.put(nuevo entero(1), "a");
table.put(nuevo entero(2), "b");
table.put(nuevo entero(3), "c");
System.out.println(tabla);
System.out.println(table.entrySet());
System.out.println(table.keySet());
System.out.println(table.values());
}
hashTableTest2 vacío estático privado ()
{
Map<Integer,String> tabla = new Hashtable<Integer, String>();
tabla.put(nulo, nulo);
tabla.put(nulo, nulo);
table.put(nuevo entero(4), nulo);
table.put(nuevo entero(5), nulo);
System.out.println(tabla);
System.out.println(table.entrySet());
System.out.println(table.keySet());
System.out.println(table.values());
}
Sorting Map se refiere principalmente a TreeMap, que tiene una complejidad temporal de O (log (n)) al agregar, eliminar y buscar elementos. No es seguro para subprocesos.
Sus características son muy similares a las de TreeSet, por lo que no entraré en detalles aquí.