web-dev-qa-db-fra.com

Pourquoi les écoles enseignent-elles des tableaux sur List?

La plupart des tâches de mon école pour les cours de programmation initiaux m'ont obligé à utiliser des tableaux. Je travaille à plein temps maintenant et je n'ai jamais utilisé de tableau pour aucun projet sur lequel j'ai travaillé. Même dans les projets existants, je n'ai jamais vu l'utilisation de tableaux nulle part. À mon avis, List est plus facile à utiliser et est un standard. Pourquoi les professeurs disent-ils aux étudiants d'utiliser des tableaux dans leurs travaux? Est-ce juste pour que les élèves comprennent les bases?

Étant donné que la plupart des universités enseignent Java, cette question est spécifique à Java.

36
Howls Hagrid

Parce que les tableaux enseignent des concepts comme l'indexation et les limites, deux concepts fondamentalement importants en programmation informatique.

Les listes sont pas un "standard". Il existe une grande variété d'espaces problématiques pour lesquels les tableaux conviennent parfaitement.

119
Robert Harvey

Ils voulaient probablement commencer par la structure de données qui représente le plus précisément le fonctionnement d'un ordinateur.Vous connaissez donc les principes fondamentaux avant de commencer à introduire des abstractions de niveau supérieur comme les listes, ce qui facilite le travail. Sinon, vous n'auriez aucun moyen de comprendre pourquoi une certaine structure ou algorithme est lent/rapide pour certaines opérations et pas pour d'autres; si la mémoire de l'ordinateur était réellement constituée de listes liées, le monde serait un endroit très différent.

Pour la même raison, ma première classe de programmation au collège était en C, et le reste des classes étaient toutes en C++, Java et d'autres langages. Ce n'est pas que C soit en quelque sorte meilleur ou plus facile , c'est que C (et Array) ne vous cache rien.

47
Ixrec

Les réponses ci-dessus sont excellentes, mais j'en ai une autre en tête. La méthode main() de Java signifie que les élèves rencontrent des tableaux de base très tôt, souvent dès le premier jour de classe. Pourquoi?

public static void main(String[] args)

C'est la première chose à laquelle vous devrez faire face pour écrire Hello World et au-delà. (J'ai vu certains cours utiliser des IDE pédagogiques comme BlueJ au début, ce qui vous permet de pointer et cliquer pour exécuter des méthodes arbitraires, mais nous allons les mettre de côté ...) Bien qu'il soit peut-être utile de passer la main sur certains ces mots-clés pendant un petit moment, tôt ou tard la plupart des enseignants voudront les expliquer. En effet, une question de test de niveau débutant classique consiste à demander aux étudiants de donner la signification de chaque mot-clé dans un programme de base Hello World. Et que trouvons-nous dans le cadre de notre signature de méthode principale? Un tableau (La raison en est en partie historique. ArrayList n'existait pas dans Java 1.0). Les tableaux font partie de cet ensemble de connaissances de base. La liste n'existe pas.

Cela dit, il n'est pas rare que les classes introduisent ArrayList un peu plus tard dans le cours, en particulier une fois que les objets et leur utilisation ont été traités. Même le programme AP Computer Science pour Java inclut ArrayList (je le sais, et Google semble indiquer qu'il le fait toujours), bien qu'il ignore le fait qu'ArrayList implémente List et le reste de le cadre des collections.

Enfin, d'après mon expérience, les programmes universitaires CS utilisent Java comme moyen d'explorer les concepts CS et de programmation plutôt que d'enseigner aux étudiants comment devenir bons Java développeurs. Certains programmes peuvent être plus axés sur le développement de développeurs professionnels tandis que d'autres se concentrent davantage sur la théorie, mais dans les deux cas, il y a beaucoup à apprendre sur la façon d'utiliser Java dans un vrai travail professionnel qui ne le fera pas). être enseigné dans la plupart des programmes universitaires. Cela va des modèles de conception et des techniques comme ceux de Java efficace à des cadres comme Spring, Hibernate ou JUnit, ou même des choses plus courantes comme JSP ou JDBC. l'esprit, en mettant l'accent sur les tableaux par rapport à ArrayList plus couramment utilisé est un peu plus logique.

21
Zach Lipton

L'une des raisons pour lesquelles les classes de programmation de première année utilisent des tableaux est héritée: c'est ainsi que les professeurs l'ont appris à l'origine avant de commencer à utiliser des bibliothèques standard avec des listes dynamiques intégrées. L'utilisation des types de données primitifs est également plus généralement applicable: les tableaux existent dans à peu près n'importe quel ordinateur sous le soleil (et peut être mis en œuvre dans une poignée d'instructions d'assemblage). Lorsque j'ai commencé à apprendre la programmation, la mise en œuvre d'une liste chaînée était l'une des tâches.

Il est beaucoup plus facile de partir des premiers principes et de dire ensuite "C'est la structure de base. Ce langage (ou ses bibliothèques) vous donne cette structure de données de haut niveau qui fait tout cela, mais vous donne x, y et z", que c'est de dire "Voilà donc ces structures de données de haut niveau, maintenant voici ce qui est sous le capot." Apprendre à raisonner l'utilisation d'une LinkedList par rapport à une ArrayList (ou d'un HashSet à un TreeSet) est généralement un cours d'algorithmes de deuxième ou de troisième année. Les listes et les cartes ont les mêmes interfaces et donnent les mêmes résultats, mais peuvent avoir des comportements considérablement différents dans une application de n'importe quelle taille. Et une fois que vous avez quitté la programmation 101, rien ne garantit que la programmation 102 utilisera le même langage. Si vous partez du concept d'un tableau, vous pouvez simplement dire "c'est ainsi que vous utilisez les tableaux dans ce langage", plutôt que d'essayer d'expliquer pourquoi vous n'obtenez pas toutes les choses fantaisistes que Java Listes te donner. Et une fois sorti du "monde réel", il y a encore des gens qui doivent programmer en C (en particulier dans les projets de haute performance où il faut se rapprocher le plus possible du métal).

Une autre raison de préférer "tableau" à "Liste" dans un cours d'introduction est que les tableaux sont fondamentalement faciles à comprendre: un tableau de 20 bytes prend 20 octets (plus un couple pour indiquer la fin du tableau ou la longueur, en fonction de la mise en œuvre).

Une "liste" est une marmite de poisson complètement différente et peut être implémentée de différentes manières (ArrayList, LinkedList et probablement un couple que j'ai oublié), avec des caractéristiques de performance fondamentalement différentes. Sans comprendre les tripes de ce que font les différentes classes List, vous ne pouvez pas avoir une discussion significative sur le moment où vous devez utiliser List foo = new ArrayList() vs List foo = new LinkedList(). Si vous essayez d'amener l'étudiant à utiliser une implémentation List, quelqu'un va vous demander pourquoi vous utilisez ArrayList au lieu de l'une des autres implémentations. Et "ArrayList" inclut le mot "Array" et est soutenu par un, donc ce n'est vraiment pas un énorme saut logique de "array" à "ArrayList".

Contrairement à la croyance populaire, il existe des situations dans lesquelles il est logique d'utiliser des tableaux sur des listes, en particulier lorsque vous avez affaire à une liste de taille statique. En voici deux:

  • La recherche et l'itération sont légèrement plus rapides car vous ne traitez pas avec la surcharge d'invocation de méthode: foo[n] Déréférence et fait de l'arithmétique de pointeur en arrière-plan, tandis que foo.get(n) doit déréférencer, faire une méthode invocation, faites une deuxième déréférence, puis peut-être faites l'arithmétique du pointeur (si vous utilisez une ArrayList; les LinkedLists doivent potentiellement itérer sur chaque élément de la Liste).
  • L'initialisation est beaucoup plus nette: int[] foo = new int[]{1, 2, 3, 4, 5} Vs les suggestions de ne autre question StackOverflow
14
Carl C.

Java permet de stocker des variables de tout type dans des tableaux. En revanche, ArrayList ne permet que le stockage des références. On ne peut donc pas discuter utilement de ArrayList sans couvrir d'abord comment l'auto-boxing convertira les primitives en types de référence, et comment l'auto-unboxing va parfois convertir les types de référence en primitives:

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)));
}

Si le code avait utilisé un int[3] plutôt qu'un ArrayList, il n'y aurait pas de surprise. Les trois éléments seraient comparables à i et les uns aux autres. Cependant, en utilisant ArrayList, même si les trois éléments de la liste sont toujours comparables à i, et que le premier et le troisième sont toujours égaux, les deux premiers éléments ne sont égaux que mutuellement lorsque i vaut 1, 10 ou 100, mais (sur la plupart des implémentations) pas lorsque i vaut 1000 ou 10000.

7
supercat

Je pense qu'il est logique d'enseigner d'abord comment utiliser les tableaux, car ArrayList utilise un tableau en interne. La classe ArrayList a une variable membre appelée elementData qui est un tableau Object.

Depuis le JDK ArrayListcode source :

/**
 * 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;

Lorsque vous ajoutez, mettez à jour, récupérez ou supprimez des éléments d'un ArrayList, il utilise ce tableau interne pour effectuer ces opérations. Comme l'utilisateur Ixrec l'a déjà souligné - ArrayList n'est qu'une abstraction de niveau supérieur qui est généralement plus facile à utiliser.

6
Derek W

En supposant que cette liste est en effet plus facile à travailler, comme vous le dites - cela n'a pas vraiment d'importance. L'apprentissage est plus "simple à complexe" que "facile à difficile". Si les fondamentaux n'étaient pas importants, alors l'informatique ne serait pas un domaine académique. Vous pouvez simplement apprendre à cliquer ensemble sur des applications à l'aide de cadres/bibliothèques existants à partir de didacticiels en ligne. (Bien sûr, quelqu'un doit écrire ces bibliothèques ... et quelqu'un doit implémenter ArrayList en premier lieu ....)

3
Matthew Read

C'est parce que la chose la plus cruciale dans l'enseignement universitaire est de vous apprendre à utiliser la bonne terminologie pour décrire les choses que vous faites.

La liste est autre chose que ce tableau. et vous ne pouvez pas utiliser Java.util.List in Java car c'est une interface. Vous utilisez généralement Java.util.ArrayList qui étant une implémentation de List, n'est pas une liste, mais un wrapper d'objet autour d'un tableau dynamique. Vous dites donc que vous utilisez une "liste" mais vous utilisez un tableau.

Il est très raisonnable d'ignorer ce chaos terminologique et d'utiliser simplement des tableaux pour apprendre aux élèves ce qu'est un tableau. Si vous utilisez des tableaux en Java, vous utilisez au moins des tableaux.

Honnêtement, c'est aussi l'argument pour lequel l'enseignement de la programmation avec Java n'est pas une bonne idée. Il est difficile d'apprendre correctement les concepts de base de la programmation.

2
Danubian Sailor

Vous n'avez littéralement jamais vu ou utilisé de tableaux du tout? Nous les utilisons tout le temps, en plus de listes. Nous n'utilisons généralement pas Java, mais nous utilisons beaucoup d'autres langages qui présentent des similitudes évidentes.

Entre les tableaux et les listes, l'un est plus léger et, en plus, plus pertinent, tandis que l'autre a plus de fonctionnalités. En règle générale dans la programmation, lorsqu'il existe deux types similaires qui sont essentiellement divisés le long de ces lignes, vous devriez opter pour le plus léger, sauf si vous avez réellement besoin du plus sophistiqué. En plus de réduire les frais généraux, cela aide à contrôler la quantité d'encombrement et l'état dans le programme et en particulier son code. Si quelque chose se passe mal pendant le test, vous avez moins d'endroits à rechercher; et plus important encore dans le cas des tableaux par rapport aux listes, les utilisateurs ont une meilleure idée de l'étendue limitée de ce que vous utilisez réellement et essayez de faire avec.

Et oui, d'un point de vue académique, il y a la raison supplémentaire d'enseigner aux étudiants les bases. Mais cela va un peu plus loin. Les tableaux et les listes sont un bon exemple de types plus volumineux, souvent simplement construits au-dessus, et souvent simplement enveloppés, d'instances sous-jacentes des types plus légers. Même lorsque les listes n'ont pas de tableaux sous-jacents, elles se comportent extérieurement comme elles le font. Une partie de l'enseignement à quelqu'un de ce qu'est une liste serait de leur apprendre ce qu'est un tableau.

Je pouvais voir cela peut-être devenir incontrôlable dans un langage comme C++, où les tableaux ne pouvaient pas être plus dépouillés qu'ils ne le sont, mais dans les langages de niveau supérieur, ils sont presque des listes en soi. S'ils répondent parfaitement à vos besoins dans une situation donnée, pourquoi auriez-vous besoin d'utiliser autre chose?

1
Panzercrisis