Solución:
No hay un tamaño máximo especificado de estas estructuras.
El límite de tamaño práctico real probablemente se encuentre en algún lugar de la región de Integer.MAX_VALUE
(es decir, 2147483647, aproximadamente 2 mil millones de elementos), ya que ese es el tamaño máximo de una matriz en Java.
- A
HashSet
usa unHashMap
internamente, por lo que tiene el mismo tamaño máximo que- A
HashMap
usa una matriz que siempre tiene un tamaño que es una potencia de dos, por lo que puede ser como máximo 230 = 1073741824 elementos grandes (ya que la siguiente potencia de dos es mayor queInteger.MAX_VALUE
). -
Normalmente el número de elementos es como máximo el número de cubos multiplicado por el factor de carga (0,75 por defecto). Sin embargo, cuando el
HashMap
deja de cambiar el tamaño, entonces todavía le permiten agregar elementos, aprovechando el hecho de que cada segmento se administra a través de una lista vinculada. Por lo tanto, el único límite para los elementos en unHashMap
/HashSet
es la memoria.
- A
- A
Vector
utiliza una matriz internamente que tiene un tamaño máximo de exactamenteInteger.MAX_VALUE
, por lo que no puede admitir más de esa cantidad de elementos - A
LinkedList
no use una matriz como almacenamiento subyacente, de modo que no limite el tamaño. Utiliza una estructura de lista clásica doblemente enlazada sin límite inherente, por lo que su tamaño es solamente limitado por la memoria disponible. Tenga en cuenta que unLinkedList
informará el tamaño incorrectamente si es más grande queInteger.MAX_VALUE
, porque usa unint
campo para almacenar el tamaño y el tipo de retorno desize()
esint
así como.
Tenga en cuenta que mientras Collection
API lo hace definir cómo un Collection
con más que Integer.MAX_VALUE
los elementos deben comportarse. Lo más importante es que afirma que size()
documentación:
Si esta colección contiene más de
Integer.MAX_VALUE
elementos, devolucionesInteger.MAX_VALUE
.
Tenga en cuenta que mientras HashMap
, HashSet
y LinkedList
parecer para apoyar a más de Integer.MAX_VALUE
elementos, ninguno de los que implementan el size()
método de esta manera (es decir, simplemente dejan que el interno size
desbordamiento de campo).
Esto me lleva a creer que otras operaciones además no están bien definidos en esta condición.
Entonces yo diría que es a salvo para usar esas colecciones de propósito general con hasta Integer.MAX_VLAUE
elementos. Si tu saber que necesitará almacenar más que eso, entonces debe cambiar a implementaciones de colección dedicadas que realmente lo admitan.
En todos los casos, es probable que esté limitado por el tamaño del montón de JVM en lugar de cualquier otra cosa. Eventualmente, siempre llegará a las matrices, por lo que dudo mucho que alguna de ellas administre más de 231 – 1 elementos, pero es muy, muy probable que te quedes sin montón antes de todos modos.
Depende mucho de los detalles de implementación.
Un HashSet utiliza una matriz como almacén subyacente que, de forma predeterminada, intenta crecer cuando la colección está llena en un 75%. Esto significa que fallará si intenta agregar más de aproximadamente 750,000,000 entradas. (No puede hacer crecer la matriz de 2 ^ 30 a 2 ^ 31 entradas)
El aumento del factor de carga aumenta el tamaño máximo de la colección. por ejemplo, un factor de carga de 10 permite 10 mil millones de elementos. (Vale la pena señalar que HashSet es relativamente ineficiente después de los 100 millones de elementos, ya que la distribución del código hash de 32 bits comienza a parecer menos aleatoria y aumenta el número de colisiones)
Un Vector duplica su capacidad y comienza en 10. Esto significa que no podrá crecer por encima de aproximadamente 1,34 mil millones. Cambiar el tamaño inicial a 2 ^ n-1 le da un poco más de espacio para la cabeza.
Por cierto: use ArrayList en lugar de Vector si puede.
Una LinkedList no tiene un límite inherente y puede crecer más allá de los 2.100 millones. En este punto, size () podría devolver Integer.MAX_VALUE, sin embargo, algunas funciones como toArray fallarán ya que no puede poner todos los objetos en una matriz, en su lugar le dará el primer Integer.MAX_VALUE en lugar de lanzar una excepción.
Como señala @Joachim Sauer, el OpenJDK actual podría devolver un resultado incorrecto para tamaños superiores a Integer.MAX_VALUE. por ejemplo, podría ser un número negativo.