Podemos determinar o comprimento de um ArrayList<E>
método público size()
, como
ArrayList<Integer> arr = new ArrayList(10);
int size = arr.size();
Da mesma forma, podemos determinar o comprimento de um Array
objeto usando a length
propriedade
String[] str = new String[10];
int size = str.length;
Enquanto o size()
método de ArrayList
é definido dentro da ArrayList
classe, onde está essa length
propriedade de Array
definida?
Respostas:
Matrizes são objetos especiais em java, eles têm um atributo simples chamado
length
qual éfinal
.Não existe uma "definição de classe" de uma matriz (você não pode encontrá-la em nenhum arquivo .class), elas fazem parte da própria linguagem.
Recursos:
fonte
ArrayList.size()
fornece o número de objetos realmente armazenados na matriz, enquantomyArray.length
([]
) fornece a "capacidade". Ou seja, se formyArray = new int[10];
, ele retornará 10. Não é o número de objetos que você colocou na matriz.List
porque usa matrizes em suas implementações.É "especial", basicamente, com a sua própria instrução bytecode:
arraylength
. Portanto, este método:é compilado no bytecode assim:
Portanto, não é acessado como se fosse um campo normal. De fato, se você tentar obtê-lo como se fosse um campo normal, assim, ele falhará:
Infelizmente, a descrição JLS de cada tipo de matriz com um campo final público
length
é um pouco enganadora :(fonte
int[]
quando os genéricos não se aplicam a tipos primitivos? (E, diabos, os genéricos não existiam por muito tempo, de qualquer maneira.) Você poderia se livrar sem matrizes usando listas vinculadas para todas as coleções, mas seria péssimo em termos de eficiência.StringBuffer
classe em si, sim - porque contém uma referência achar[]
(pelo menos; ou não; não sei se ainda existe, de imediato). Portanto, enquanto aStringBuilder
é responsável por mais memória, seu tamanho e layout imediatos são corrigidos.É definido na especificação da linguagem Java :
Como existe um número ilimitado de tipos de matriz (para cada classe, há um tipo de matriz correspondente e, em seguida, há matrizes multidimensionais), elas não podem ser implementadas em um arquivo de classe; a JVM precisa fazer isso rapidamente.
fonte
Mesmo que essa não seja uma resposta direta à pergunta, é uma adição ao argumento
.length
vs..size()
Eu estava pesquisando algo relacionado a essa pergunta e, quando me deparei com ela, percebi que as definições fornecidas aquinão está "exatamente" correto.
O comprimento do campo contém o número de locais disponíveis para colocar um componente, não o número de componentes presentes na matriz. Portanto, representa a memória total disponível alocada para essa matriz, e não quanto dessa memória é preenchida.
Exemplo:
Resultado:
No entanto, a
.size()
propriedade doArrayList
fornece o número de elementos na lista:Resultado:
fonte
null
elementos não nulos. Mas a distinção não funciona. Afinal, osize()
(digamos) a tambémList
pode incluirnull
valores.size
quero dizer é que se comporta dinamicamente, enquantolength
é uma propriedade estática ... o fato de o espaço restante não preenchido em uma matriz ser inicializado como " Não Valores " (dependendo do tipo) não contradiz esse ponto.é um campo final público, que contém o número de componentes da matriz (o comprimento pode ser positivo ou zero)
Uma matriz, portanto, tem os mesmos campos e métodos públicos que a seguinte classe:
mais informações em
10.7 Membros da matriz
http://java.sun.com/docs/books/jls/second_edition/html/arrays.doc.html
fonte
Para responder como está, onde está definida essa propriedade de comprimento da matriz ? Em um especial
Object header
.Fácil de ver via JOL
Uma das linhas desta saída será:
Geralmente, os objetos têm dois cabeçalhos (marca e klass), os arrays têm mais um que sempre ocupa
4 bytes
em comprimento, comosize
é umint
.fonte
O comprimento da palavra-chave atua como um dado arquivado definido. Ao usar em uma matriz, podemos usá-la para acessar quantos elementos em uma matriz. Em relação a String [], podemos invocar o método length () definido na classe String. No que diz respeito ao ArrayList, podemos usar o método size () definido em ArrayList. Observe que, ao criar uma lista de matrizes com ArrayList <> (capacidade), o tamanho inicial () dessa lista de matrizes é zero, pois não há elemento.
fonte