Por que as escolas ensinam arrays sobre List? [fechadas]

36

A maioria das tarefas da minha escola para as aulas iniciais de programação exigia que eu usasse matrizes. Eu trabalho a tempo inteiro agora, e nunca usei uma matriz para qualquer projeto em que trabalhei. Mesmo nos projetos existentes, nunca vi o uso de matrizes em lugar nenhum. Na minha opinião, a Lista é mais fácil de usar e é um padrão. Por que os professores dizem aos alunos para usar matrizes em suas tarefas? É só para que os alunos entendam o básico?

Como a maioria das universidades ensina Java, essa questão é específica do Java.

    
por Howls Hagrid 11.03.2015 / 00:50
fonte

9 respostas

120

Como os arrays ensinam conceitos como indexação e limites, dois conceitos fundamentalmente importantes na programação de computadores.

As listas não são como "padrão". Há uma grande variedade de espaços problemáticos para os quais os arrays são um ajuste perfeito.

    
por 11.03.2015 / 01:12
fonte
48

Eles provavelmente quiseram começar com a estrutura de dados que representa com mais precisão como um computador funciona, portanto, você está familiarizado com os fundamentos antes de começar a introduzir abstrações de nível superior, como Listas, o que facilita o trabalho. Caso contrário, você não teria como entender por que uma determinada estrutura ou algoritmo é lento / rápido para algumas operações e não para outras; se a memória do computador fosse realmente feita de listas encadeadas, o mundo seria um lugar muito diferente.

Pela mesma razão, minha primeira aula de programação na faculdade foi em C, e as outras classes estavam todas em C ++, Java e outras linguagens. Não é que C seja de alguma forma melhor ou mais fácil, é que C (e Array) não esconde nada de você.

    
por 11.03.2015 / 01:16
fonte
20

As respostas acima são ótimas, mas eu tenho outra em mente. O método main() do Java significa que os alunos encontram matrizes básicas muito cedo, geralmente logo no primeiro dia de aula. Por quê?

public static void main(String[] args)

É a primeira coisa que você vai ter que lidar para escrever Hello World e além. (Eu vi que alguns cursos usam IDEs de ensino como o BlueJ em primeiro lugar, o que permite que você aponte e clique para executar métodos arbitrários, mas vamos separá-los ...) Embora possa valer a pena dar uma mãozinha sobre alguns dos essas palavras-chave por um tempo, mais cedo ou mais tarde, a maioria dos professores vai querer explicá-las. De fato, uma pergunta clássica de teste em nível de iniciante é pedir aos alunos que forneçam o significado de cada palavra-chave em um programa básico Hello World. E o que encontramos como parte de nossa principal assinatura de método? Uma matriz (A razão para isso é, em parte, histórica. A ArrayList não existia no Java 1.0). Arrays são parte desse conjunto básico de conhecimento. Lista não é.

Dito isso, não é incomum que as classes introduzam o ArrayList um pouco mais tarde no curso, especialmente quando os objetos e seu uso tiverem sido abordados. Até mesmo o currículo de AP Computer Science para Java inclui ArrayList (eu sei que costumava fazer, e o Google parece indicar que ainda faz isso), embora ignore o fato de que ArrayList implementa List e o resto do Collections Framework.

Por fim, é minha experiência que programas universitários de computação gráfica usam Java como um meio de explorar CS e conceitos de programação, em vez de ensinar os alunos a se tornarem bons desenvolvedores Java. Alguns programas podem ser mais focados em desenvolver desenvolvedores profissionais, enquanto outros se concentram mais na teoria, mas em ambos os casos, há muito o que aprender sobre como usar o Java em um trabalho profissional real que não será ensinado na maioria dos currículos universitários. Isso varia de padrões e técnicas de projeto, como aqueles em Java efetivo , a frameworks como Spring, Hibernate ou JUnit, ou até mesmo coisas mais comuns, como JSP ou JDBC. Com essa filosofia em mente, enfatizar matrizes sobre o ArrayList, mais comumente usado, faz um pouco mais de sentido.

    
por 11.03.2015 / 04:28
fonte
14

Um motivo pelo qual as classes de programação do primeiro ano usam arrays é legado: foi assim que os professores aprenderam originalmente antes de começarmos a usar bibliotecas padrão com listas dinâmicas. O uso dos tipos de dados primitivos também é mais geralmente aplicável: arrays existem em muito qualquer linguagem de computador sob o sol (e pode ser implementado em um punhado de instruções de montagem). Quando comecei a aprender programação, implementar uma lista vinculada era uma das atribuições.

É muito mais fácil partir dos primeiros princípios e depois dizer "Essa é a estrutura básica. Essa linguagem (ou suas bibliotecas) fornece a estrutura de dados de alto nível que faz tudo isso, mas fornece x, y e z , "do que é dizer" Então, essas são as estruturas de dados de alto nível, eis aqui o que está sob o capô. " Aprender a raciocinar sobre o uso de um LinkedList vs. um ArrayList (ou um HashSet vs. um TreeSet) geralmente é um curso de Algoritmos de segundo ou terceiro ano. As listas e os mapas têm as mesmas interfaces e fornecem os mesmos resultados, mas podem ter comportamentos drasticamente diferentes em um aplicativo de qualquer tamanho. E uma vez que você sai da Programação 101, não há garantia de que a Programação 102 estará usando a mesma linguagem. Se você começar a partir do conceito de array, você pode simplesmente dizer "é assim que usa arrays nesta linguagem", ao invés de tentar explicar por que você não consegue todas as coisas que Java Lists lhe oferece. E uma vez que você entra no "mundo real", ainda existem pessoas que precisam programar em C (particularmente em projetos de alto desempenho onde você precisa chegar o mais próximo possível do metal).

Outro motivo para preferir "matriz" à "Lista" em um curso introdutório é que as matrizes são fundamentalmente fáceis de entender: uma matriz de 20 bytes leva 20 bytes (mais um par para indicar o final da matriz ou o comprimento, dependendo da implementação).

Uma "Lista" é uma chaleira de peixe completamente diferente e pode ser implementada de muitas maneiras diferentes (ArrayList, LinkedList e provavelmente um casal que esqueci), com características de desempenho fundamentalmente diferentes. Sem entender a coragem do que as diferentes classes da Lista estão fazendo, você não pode ter uma discussão significativa sobre quando deve usar List foo = new ArrayList() vs. List foo = new LinkedList() . Se você tentar fazer com que o aluno use uma implementação de Lista, alguém perguntará por que você está usando o ArrayList em vez de uma das outras implementações. E "ArrayList" inclui a palavra "Array" e é apoiada por um, então não é realmente um enorme salto lógico de "array" para "ArrayList".

Ao contrário da crença popular, existem situações em que faz sentido usar arrays em listas, principalmente quando você está lidando com uma lista de tamanho estático. Aqui está um casal:

  • Pesquisa e iteração são um pouco mais rápidas porque você não está lidando com sobrecarga de invocação de método: foo[n] desreferencia e faz alguma aritmética de ponteiro por trás dos bastidores, enquanto foo.get(n) tem que ser desreferenciada, invocar um método, fazer um segundo desreferenciamento, e então talvez faça aritmética de ponteiros (se você estiver usando uma ArrayList; LinkedLists potencialmente precisam percorrer todos os elementos da Lista).
  • A inicialização é muito mais clara: int[] foo = new int[]{1, 2, 3, 4, 5} vs. as sugestões em Another StackOverflow pergunta
por 11.03.2015 / 23:44
fonte
7

Java permite que variáveis de qualquer tipo sejam armazenadas em matrizes. Por contraste, ArrayList permite apenas o armazenamento de referências. Não é possível, portanto, discutir ArrayList sem antes abordar como o auto-boxing converterá primitivas em tipos de referência e como o auto-unboxing às vezes converterá tipos de referência em primitivos:

for (int i=10; i<=10000; i*=10)
{
    ArrayList<Integer> l = new ArrayList<Integer>();
    l.add(i);
    l.add(i);
    l.add(l.get(0));
    System.out.print("i=" + i);
    System.out.print(" #0==i:" + (l.get(0)==i));
    System.out.print(" #1==i:" + (l.get(1)==i));
    System.out.print(" #2==i:" + (l.get(2)==i));
    System.out.print(" #0=#1:" + (l.get(0)==l.get(1)));
    System.out.print(" #1=#2:" + (l.get(1)==l.get(2)));
    System.out.println(" #0=#2:" + (l.get(0)==l.get(2)));
}

Se o código tivesse usado um int[3] em vez de um ArrayList , não haveria surpresas. Todos os três elementos se comparam igual a i e entre si. Usando ArrayList , no entanto, mesmo que todos os três elementos da lista sempre sejam iguais a i , e o primeiro e o terceiro sempre serão comparados entre si, os dois primeiros elementos serão iguais entre si quando i é 1, 10 ou 100, mas (na maioria das implementações) não quando i é 1000 ou 10000.

    
por 11.03.2015 / 16:34
fonte
6

Acho que faz sentido ensinar como usar matrizes primeiro devido ao fato de ArrayList usar uma matriz internamente. A classe ArrayList tem uma variável de membro chamada elementData , que é uma matriz Object .

Do JDK ArrayList código-fonte :

/**
 * The array buffer into which the elements of the ArrayList are stored.
 * The capacity of the ArrayList is the length of this array buffer.
 */
private transient Object[] elementData;

Quando você adiciona, atualiza, recupera ou remove elementos de um ArrayList , ele usa essa matriz interna para fazer essas operações. Como o usuário Ixrec já apontou - ArrayList é apenas uma abstração de nível superior que normalmente é mais fácil de se trabalhar.

    
por 11.03.2015 / 13:58
fonte
3

Assumindo que a lista é realmente mais fácil de trabalhar, como você diz - isso não importa realmente. Aprender é mais sobre "básico para complexo" do que "fácil para difícil". Se os fundamentos não fossem importantes, a ciência da computação não seria um campo acadêmico. Você pode aprender como clicar em aplicativos juntos usando estruturas / bibliotecas existentes de tutoriais on-line. (Claro, alguém tem que escrever essas bibliotecas ... e alguém tem que implementar ArrayList em primeiro lugar ...)

    
por 11.03.2015 / 15:50
fonte
2

É porque a coisa mais importante na educação acadêmica é ensinar você a usar a terminologia correta para descrever as coisas que você faz.

Lista é algo diferente dessa matriz. e você não pode usar java.util.List em Java porque é uma interface. Você geralmente usa java.util.ArrayList , que é uma implementação de Lista, não é uma lista, mas um wrapper de objeto em torno de uma matriz dinâmica. Então você diz que usa uma 'Lista', mas usa uma matriz.

É muito razoável pular esse caos terminológico e simplesmente usar arrays para aprender os alunos sobre o que é array. Se você usa arrays em Java, pelo menos você usa arrays.

Honestamente, é também o argumento de que ensinar programação com Java não é uma boa ideia. É difícil aprender os conceitos básicos da programação corretamente.

    
por 13.03.2015 / 10:47
fonte
1

Você literalmente nunca viu ou usou matrizes? Nós os usamos o tempo todo, além de listas. Geralmente não usamos Java, mas usamos muitas outras linguagens que desenham semelhanças óbvias.

Entre arrays e listas, é mais leve e, além disso, mais para o ponto, enquanto o outro tem mais funcionalidade. Como regra geral na programação, quando há dois tipos similares que são basicamente divididos ao longo dessas linhas, você deve escolher o mais leve, a menos que você realmente precise de um mais sofisticado. Além de reduzir a sobrecarga, isso realmente ajuda a manter um controle sobre a quantidade de desordem e estado no programa e particularmente seu código . Se algo der errado durante o teste, você terá menos lugares para procurar; e, mais importante, no caso de arrays vs. Lists, as pessoas têm uma ideia melhor do escopo limitado do que você realmente está usando e tentando fazer com ele.

E sim, do ponto de vista acadêmico, há a razão adicional de ensinar aos alunos o básico. No entanto, isso vai um pouco mais fundo. Matrizes e listas são um bom exemplo de tipos mais volumosos, muitas vezes apenas sendo construídos sobre, e freqüentemente apenas envolvendo, instâncias subjacentes dos tipos mais leves. Mesmo quando as listas não têm matrizes subjacentes, elas se comportam externamente como elas. Uma parte de ensinar a alguém o que é uma lista seria ensiná-los o que é uma matriz.

Eu poderia ver isso talvez saindo do controle em uma linguagem como C ++, onde as matrizes basicamente não poderiam ser mais despojadas do que são, mas em linguagens de nível mais alto, elas são quase listas em si mesmas. Se eles se adequarem perfeitamente às suas necessidades em uma determinada situação, por que você precisaria usar outra coisa?

    
por 12.03.2015 / 20:15
fonte