Pergunta

Costumo usar uma ArrayList em vez de um array[] 'normal'.

Eu me sinto como se eu estivesse traindo (ou ser preguiçoso) quando eu uso um ArrayList, quando é aprovado usar um ArrayList em uma matriz?

Foi útil?

Solução

Arrays são fortemente digitado, e de trabalho bem como parâmetros. Se você sabe o comprimento de sua coleção e é fixo, você deve usar uma matriz.

ArrayLists não são fortemente digitado, cada inserção ou novo julgamento vai precisar de um elenco para voltar para o seu tipo de original. Se você precisa de um método para fazer uma lista de um tipo específico, ArrayLists aquém porque você poderia passar em um ArrayList contendo qualquer tipo. ArrayLists usar uma matriz de expansão dinâmica internamente, então há também um sucesso para expandir o tamanho da matriz interna quando ela atinge a sua capacidade.

O que você realmente deseja usar é uma lista genérica como List<T>. Isto tem todas as vantagens da matriz e ArrayLists. Ele é fortemente tipado e suporta um comprimento variável de itens.

Outras dicas

Além de Bob ea resposta de Frederick, eu gostaria de apontar que, enquanto matrizes têm covariância, listas genéricas não. Por exemplo, uma matriz do tipo MyChildClass[] podem ser facilmente fundidas a MyParentClass[], enquanto List<MyChildClass> não pode ser fundido a List<MyParentClass>, pelo menos, não directamente.

Se precisar de covariância, use matrizes, método de uso do LINQ Elenco () ou algum outro meio para lançar cada item individualmente ou espera para C # 4 .

Um outro pensamento aqui é mutação; uma matriz (T[]) é totalmente mutável, e não pode ser protegido. List<T> não fornece quaisquer pontos de extensão úteis, mas coisas como Collection<T> (ou muitas outras implementações IList<T>) permitem que você adicione código, por exemplo, para verificar itens antes de serem adicionados; Da mesma forma, você pode ter implementações somente leitura IList<T>, o que é útil para a segurança segmento onde imutabilidade é desejável.

I tendem a usar matrizes, quer na lógica método interno (talvez como uma variável local), como argumentos params, ou em alguns casos altamente otimizadas, onde eu conheço o comprimento dos itens, e eu sei o código escolhe não a mutação-lo (como um campo privado). Fora isso, List<T> etc tendem a ser mais comum, pois eles têm muito menos sobrecarga ao adicionar / remover itens.

A menos que parte do código é absolutamente desempenho-crítico, usando ArrayList é perfeitamente bem.

Melhor ainda, onde quer que você use ArrayList, use a coleção genérica List<T> vez. É mais fortemente tipado do que o anterior.

Eu estou respondendo isso de uma perspectiva Java, mas é o mesmo problema básico. Você não deve se sentir culpado usando abstrações superiores. Afinal, você está usando Strings em vez de char[], ou mesmo byte[]? Eu até sugiro que ir um passo adiante e usar a interface List sempre que possível. A única razão para ir um passo para baixo é por motivos de desempenho.

Usando a mais alta abstração coleção tem muitas vantagens. Você pode adicionar decoradores para fazer a lista somente leitura, torná-lo fixo tamanho, itens de verificação que entram ou saem das vistas coleta ou uso (ver GetRange em C # e subList em Java.)

A propósito, um ArrayList deve sempre ser baseada em uma matriz primitiva, caso contrário, o nome está errado. As operações são normalmente implementado apenas como seria de esperar quando se utiliza uma matriz primitiva. Se uma lista ligada é usado geralmente é chamado apenas isso - LinkedList. Isso é também uma vantagem de usar a interface:. Você pode mudar de idéia sobre a implementação usada mais tarde

Existem algumas coisas que fazem o uso de coleções desajeitado. Uma ressalva é que as coleções são geralmente baseados em objetos, e as línguas têm uma lacuna considerável entre tipos primitivos e objetos. Os genéricos limitadas não ajuda muito. Ainda assim, eu recomendo as coleções mais matrizes a menos que haja uma boa razão contrário.

Para valores primitivos você também pode considerar o uso de uma biblioteca coleção primitiva, por exemplo GNU Trove . Não sei se há alguma coisa semelhante para C #, no entanto.

Fabulous Adventures In Codificação escreveu uma peça Arrays considerados um pouco prejudicial. É uma leitura muito interessante.

Bem para um, se você só pretende lidar com um tipo específico, você não deve usar um ArrayList. Por exemplo, se você só esperar um array de bytes, você só deve aceitar uma matriz de bytes.

Só o tempo eu acho que você pode até pensar em usar um ArrayList é em vez de List.

O tamanho da matriz é estático, por isso, se você sabe o tamanho no momento da concepção, array uso. Supõe-se para trabalhar mais rápido, mas eu não testei isso sozinho. Se você precisar alterar a contagem de objetos com frequência (adição ou remoção de objetos da coleção) uso ArrayList ou melhor a Lista de genéricos de .NET 2. É também mais fácil de usar, por isso, se o desempenho não é crucial, você sempre pode usar List.

Se você precisar de uma matriz de tipos primitivos usar Array para um melhor desempenho uma vez que irá evitar autoboxing e unboxing. Mas só se você sabe o tamanho que você quer antes do tempo.

É como esta.

using System;
using System.Collections;

namespace ConsoleApplication2
{
    class Program
    {
        static void Main(string[] args)
        {
            //ArrayList
            /*
             An ArrayList doesn't use a LinkedList as the internal data structure! .we can store any type of objects      
             */
            ArrayList list = new ArrayList();
            list.Add("1"); // not strongly type,you can enter any object types (int,string decimals, etc..)
            list.Add(1);
            list.Add(1.25);

            //Array
            /*
             must declare length.
             */
            string[] array = new string[3]; // you must declare object types
            array[0] = "1";
            //array[1] = 1; this get error becoz array is storngly typed. // this print empty value when you run it
            array[2] = "stongly typed";
            Console.WriteLine("------- ARRAYLIST ITEMS ---------");
            foreach (var i in list) {
                Console.WriteLine(i);
            }

            Console.WriteLine("--------- ARRAY ITEMS -----------");
            foreach (var i in array)
            {
                Console.WriteLine(i);
            }

            Console.ReadKey(); 
        }
    }
}
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top