Qual é o valor máximo do índice de um ArrayList?

4

Eu estava pensando sobre isso. Você pode ter acesso à memória infinita (um computador com muita memória RAM) para que você possa continuar adicionando mais e mais elementos à sua ArrayList.

Mas, acho que você só pode acessar elementos BY INDEX até um determinado valor de índice. O tamanho máximo deste índice pode ser = número máximo que o seu computador pode representar, isto é, 9,223,372,036,854,775,807 em Java.

Eu sei que você pode acessar o elemento NEXT usando um iterador. Mas, como faço para acessar elementos após o índice (9.223.372.036.854.775.807) TH, usando um número de índice?

    
por Jedi Knight 18.03.2013 / 01:40
fonte

2 respostas

14

ArrayList em Java tem um get ( int index) . int é um valor assinado de 32 bits, com um valor máximo de 2.147.483.647. Esse é o maior valor possível que pode ser acessado em ArrayList . Período. As especificidades de qual o tamanho máximo do array ou ArrayList diferem com base na implementação da JVM (que pode ser menor que o valor MAX_INT ). Você não pode fazer um ArrayList (ou, nesse caso, um int[] array) que tenha um long para seu índice.

Se você tentasse instanciar uma lista de matriz dessa magnitude, teria uma estrutura de pelo menos 8 gigabytes - isso representa apenas os ponteiros MAX_INT e não o espaço adicional dos dados em cada ponto.

A tentativa de acessar além do valor máximo permitido por meio de um iterador associado à matriz provavelmente resultaria em% deOutOfMemoryException, IndexOutOfBoundsException ou NoSuchElementException dependendo da implementação.

Este é um uso muito impraticável da memória. Se alguém quiser essa estrutura de dados, deve-se investigar menos abordagens intensivas de RAM, como bancos de dados, matrizes esparsas e afins.

    
por 18.03.2013 / 02:07
fonte
7

Para matrizes normais, se você estiver usando o estoque JVM do Oracle, parece que a resposta real é MAX_INT-5 ou MAX_INT-2 dependendo da versão.

Para ArrayList , a resposta parece ser MAX_INT-8 . (Linha 191, como o código fonte aparentemente não tem âncoras para linkar!)

    
por 18.03.2013 / 06:48
fonte