Saltar al contenido

Tamaño máximo de HashSet, Vector, LinkedList

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 un HashMap 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 que Integer.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 un HashMap/HashSet es la memoria.
  • A Vector utiliza una matriz internamente que tiene un tamaño máximo de exactamente Integer.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 un LinkedList informará el tamaño incorrectamente si es más grande que Integer.MAX_VALUE, porque usa un int campo para almacenar el tamaño y el tipo de retorno de size() es int 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, devoluciones Integer.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.

¡Haz clic para puntuar esta entrada!
(Votos: 0 Promedio: 0)



Utiliza Nuestro Buscador

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *