Perché le scuole insegnano gli array rispetto a List? [chiuso]

36

La maggior parte degli incarichi nella mia scuola per le classi di programmazione iniziali mi ha richiesto di utilizzare gli array. Lavoro a tempo pieno ora e non ho mai usato un array per qualsiasi progetto su cui ho lavorato. Anche nei progetti in corso non ho mai visto l'uso di array ovunque. A mio parere, Elenco è più facile da usare ed è uno standard. Perché i professori dicono agli studenti di usare gli array nei loro compiti? È solo così che gli studenti capiscono le basi?

Poiché la maggior parte delle università insegna Java, questa domanda è specifica di Java.

    
posta Howls Hagrid 11.03.2015 - 00:50
fonte

9 risposte

120

Poiché gli array insegnano concetti come indicizzazione e limiti, due concetti fondamentalmente importanti nella programmazione di computer.

Le liste sono non a "standard". Esiste un'ampia varietà di spazi per i problemi per i quali gli array sono perfetti.

    
risposta data 11.03.2015 - 01:12
fonte
48

Probabilmente volevano iniziare con la struttura dati che rappresenta in modo più preciso il funzionamento di un computer, quindi hai familiarità con i fondamenti prima di iniziare a introdurre astrazioni di livello superiore come le liste che rendono più facile lavorare con. Altrimenti non avresti modo di capire perché una certa struttura o algoritmo sia lento / veloce per alcune operazioni e non per altre; se la memoria del computer fosse effettivamente composta da liste collegate, il mondo sarebbe un posto molto diverso.

Per lo stesso motivo, il mio primo corso di programmazione al college era in C, e il resto delle classi erano tutte in C ++, Java e altre lingue. Non è che C sia in qualche modo migliore o più semplice, è che C (e Array) non ti nasconde nulla.

    
risposta data 11.03.2015 - 01:16
fonte
20

Le risposte sopra sono grandiose, ma ne ho un'altra in mente. Il metodo main() di Java significa che gli studenti incontrano gli array di base molto presto, spesso non appena il primo giorno di lezione. Perché?

public static void main(String[] args)

È la prima cosa che dovrai affrontare per scrivere Hello World e oltre. (Ho visto alcuni corsi utilizzare l'insegnamento di IDE come BlueJ all'inizio, che consentono di puntare e fare clic per eseguire metodi arbitrari, ma li metteremo da parte ...) Mentre potrebbe valere la pena di passare queste parole chiave per un po ', prima o poi la maggior parte degli insegnanti vorrà spiegarle. In effetti, una classica domanda di test a livello principiante consiste nel chiedere agli studenti di dare il significato di ciascuna parola chiave in un programma base Hello World. E cosa troviamo come parte della nostra firma del metodo principale? Una matrice (la ragione è, in parte, storica. ArrayList non esisteva in Java 1.0). Gli array fanno parte di quel set base di conoscenza. Elenco non è.

Detto questo, non è raro che le classi introducano ArrayList un po 'più avanti nel corso, specialmente una volta che gli oggetti e il loro uso sono stati trattati. Persino il curriculum di AP Computer Science per Java include ArrayList (lo conosco, e Google sembra indicare che lo fa ancora), sebbene ignori il fatto che ArrayList implementa List e il resto del Collections Framework.

Infine, è la mia esperienza che i programmi universitari di CS usano Java come mezzo per esplorare CS e programmare concetti piuttosto che insegnare agli studenti come diventare buoni sviluppatori Java. Alcuni programmi potrebbero essere più focalizzati sulla sfornamento di sviluppatori professionisti, mentre altri si concentrano maggiormente sulla teoria, ma in entrambi i casi, c'è molto da imparare su come utilizzare Java in un lavoro professionale reale che non verrà insegnato nella maggior parte dei programmi universitari. Questo spazia da modelli e tecniche di progettazione come quelli in Java efficace a quadri come Spring, Hibernate o JUnit, o anche a cose più comuni come JSP o JDBC. Con questa filosofia in mente, enfatizzare gli array rispetto agli ArrayList più comunemente usati ha un po 'più senso.

    
risposta data 11.03.2015 - 04:28
fonte
14

Un motivo per cui le classi di programmazione del primo anno utilizzano gli array è legacy: è così che i professori lo avevano appreso in origine prima di iniziare a utilizzare le librerie standard con elenchi dinamici integrati. L'uso dei tipi di dati primitivi è anche più generalmente applicabile: gli array esistono in molto qualsiasi linguaggio del computer sotto il sole (e può essere implementato in una manciata di istruzioni di assemblaggio). Quando stavo iniziando a programmare, l'implementazione di un elenco collegato era uno dei compiti.

È molto più facile iniziare dai principi primi e poi dire "Questa è la struttura di base.Questo linguaggio (o le sue librerie) ti dà questa struttura di dati di alto livello che fa tutto questo, ma ti dà x, ye z , "piuttosto che dire" Quindi queste sono le strutture dati di alto livello, ora ecco cosa c'è sotto il cofano. " Imparare a ragionare sull'opportunità di utilizzare un LinkedList o un ArrayList (o un HashSet o un TreeSet) è solitamente un corso di Algoritmi di secondo o terzo anno. Elenchi e mappe hanno le stesse interfacce e danno gli stessi risultati, ma possono avere comportamenti drammaticamente differenti in un'applicazione di qualsiasi dimensione. E una volta usciti dalla programmazione 101, non è possibile garantire che Programming 102 utilizzi la stessa lingua. Se inizi dal concetto di array, puoi semplicemente dire "questo è il modo in cui usi gli array in questo linguaggio", piuttosto che cercare di spiegare perché non ottieni tutte le cose fantasiose che gli elenchi Java ti danno. E una volta usciti nel "mondo reale", ci sono ancora persone là fuori che devono programmare in C (in particolare in progetti ad alte prestazioni in cui è necessario avvicinarsi il più possibile al metallo).

Un altro motivo per preferire "array" a "List" in un corso introduttivo è che gli array sono fondamentalmente facili da capire: un array di 20% di co_de richiede 20 byte (più una coppia per indicare la fine dell'array o la lunghezza, a seconda dell'implementazione).

Un "elenco" è un insieme di pesci completamente diverso e può essere implementato in molti modi diversi (ArrayList, LinkedList e probabilmente una coppia che ho dimenticato), con caratteristiche di performance fondamentalmente diverse. Senza comprendere il coraggio di ciò che fanno le diverse classi List, non puoi avere una discussione significativa su quando dovresti usare bytes vs. List foo = new ArrayList() . Se provi a indurre lo studente a utilizzare un'implementazione List, qualcuno chiederà perché stai usando ArrayList invece di una delle altre implementazioni. E "ArrayList" include la parola "Array" ed è supportata da uno, quindi in realtà non è un enorme salto logico da "array" a "ArrayList".

Contrariamente alla credenza popolare, ci sono situazioni in cui ha senso utilizzare gli array su Liste, in particolare quando si ha a che fare con un elenco di dimensioni statiche. Ecco un paio:

  • Ricerca e iterazione sono leggermente più veloci perché non hai a che fare con overhead di invocazione del metodo: List foo = new LinkedList() dereferences e qualche aritmetica del puntatore dietro le quinte, mentre foo[n] deve dereferenziare, eseguire un richiamo di metodo, eseguire un secondo dereferenziamento, e quindi forse esegui l'aritmetica del puntatore (se stai usando un ArrayList; le liste collegate potenzialmente devono scorrere su ogni elemento dell'elenco).
  • L'inizializzazione è molto più pulita: foo.get(n) rispetto ai suggerimenti in Another StackOverflow domanda
risposta data 11.03.2015 - 23:44
fonte
7

Java consente di memorizzare variabili di qualsiasi tipo in array. Al contrario, ArrayList consente solo la memorizzazione di riferimenti. Quindi non si può discutere utilmente di ArrayList senza prima capire come il auto-boxing convertirà le primitive in tipi di riferimento e in che modo l'auto-unboxing a volte converte i tipi di riferimento in primitive:

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 il codice avesse utilizzato un int[3] anziché un ArrayList , non ci sarebbero sorprese. Tutti e tre gli elementi dovrebbero essere uguali a i e tra loro. Tuttavia, utilizzando ArrayList , anche se tutti e tre gli elementi della lista saranno sempre confrontati uguale a i , e il primo e il terzo saranno sempre confrontati uguali tra loro, i primi due elementi saranno uguali tra loro solo quando i è 1, 10 o 100, ma (sulla maggior parte delle implementazioni) non quando i è 1000 o 10000.

    
risposta data 11.03.2015 - 16:34
fonte
6

Penso che abbia senso insegnare come usare gli array prima perché il ArrayList usa un array internamente. La classe ArrayList ha una variabile membro chiamata elementData che è una matrice Object .

Dal JDK ArrayList codice sorgente :

/**
 * 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 aggiungi, aggiorna, recuperi o rimuovi elementi da un ArrayList , usa questa matrice interna per eseguire tali operazioni. Come ha già fatto notare l'utente Ixrec - ArrayList è solo un'astrazione di livello superiore che in genere è più facile da utilizzare.

    
risposta data 11.03.2015 - 13:58
fonte
3

Supponendo che la lista sia effettivamente più facile da usare, come dici tu, non ha molta importanza. L'apprendimento riguarda più da "base a complesso" che da "facile a duro". Se i fondamentali non fossero importanti, l'informatica non sarebbe un campo accademico. Potresti solo imparare a fare clic su insieme app utilizzando framework / librerie esistenti da esercitazioni online. (Certo, qualcuno deve scrivere quelle librerie ... e qualcuno deve implementare ArrayList in primo luogo ...)

    
risposta data 11.03.2015 - 15:50
fonte
2

È perché la cosa più importante nell'educazione accademica è insegnarti ad usare la terminologia corretta per descrivere le cose che fai.

Elenco è qualcosa di diverso da quell'array. e Non è possibile utilizzare java.util.List in Java perché è un'interfaccia. Solitamente si usa java.util.ArrayList che è un'implementazione di List, non è una lista, ma un wrapper di oggetti attorno a una matrice dinamica. Quindi dici di usare un 'Elenco' ma utilizzi un array.

È molto ragionevole saltare quel caos terminologico e usare semplicemente gli array per imparare agli studenti che cos'è un array. Se usi array in Java, almeno usi gli array.

Onestamente, è anche l'argomento per cui insegnare la programmazione con Java non è una buona idea. È difficile apprendere correttamente i concetti di base della programmazione.

    
risposta data 13.03.2015 - 10:47
fonte
1

Hai letteralmente mai visto o usato alcun array? Li usiamo sempre, oltre agli elenchi. Di solito non usiamo Java, ma usiamo un sacco di altri linguaggi che richiamano evidenti somiglianze.

Tra array e liste, il peso più leggero di uno e, in aggiunta, più al punto, mentre l'altro ha più funzionalità. Come regola generale nella programmazione, quando ci sono due tipi simili che sono fondamentalmente divisi lungo quelle linee, dovresti optare per uno più leggero, a meno che tu non abbia effettivamente bisogno di quello più elaborato. Oltre a ridurre il sovraccarico, questo in realtà aiuta a tenere sotto controllo la quantità di clutter e stato nel programma e in particolare il suo codice . Se qualcosa va storto durante i test, hai meno posti da guardare; e, cosa più importante, nel caso di matrici contro liste, le persone hanno un'idea più precisa dell'ambito limitato di ciò che effettivamente stai usando e cercando di farlo.

E sì, da un punto di vista accademico, c'è una ragione aggiunta per insegnare agli studenti le basi. Tuttavia questo va un po 'più in profondità. Le matrici e gli elenchi sono un buon esempio di tipi più voluminosi che spesso vengono semplicemente costruiti sopra e, spesso, semplicemente avvolgendo, le istanze sottostanti dei tipi più leggeri. Anche quando le liste non hanno array sottostanti, si comportano esteriormente come fanno. Una parte di insegnare a qualcuno cosa è una lista è insegnare loro che cos'è un array.

Potevo vedere che forse stava sfuggendo di mano in un linguaggio come il C ++, dove gli array in pratica non potevano essere più spogli di quanto non siano, ma nei linguaggi di livello superiore, sono quasi elenchi di se stessi. Se soddisfano perfettamente le tue esigenze in una determinata situazione, perché dovresti usare qualcos'altro?

    
risposta data 12.03.2015 - 20:15
fonte

Leggi altre domande sui tag