Esistono casi d'uso per l'Elenco quando Deques e Array sono disponibili?

1

Ci stavo pensando nelle ultime settimane e non ho trovato argomenti validi. La mia prospettiva è di Java, ma se qualcuno ha dei casi specifici per la lingua al di fuori di questa lingua, mi piacerebbe sentirli.

Mi sembra che il vantaggio di usare un Elenco su un Deque derivi dal fatto che si può accedere agli elementi direttamente tramite numeri di indice. Mentre posso vedere l'uso in qualcosa di simile a un'interfaccia utente (ad esempio, con una lista di trascinamento di trascinamento della selezione), quando si parla di interazione di codice puro, vedo tre casi per questo:

  1. iterazione. L'iterazione con un ciclo for utilizzando get(i) e size() è costosa nella maggior parte delle implementazioni e solitamente può essere eseguita meglio con iterator() , che è presente in ogni Iterable raccolta.

  2. Ricerca per indice. Questo di solito richiede una tabella di indici e una lista di lunghezza fissa, nel qual caso si otterrebbe prestazioni migliori da un array.

  3. Operando sulla parte anteriore o posteriore di List . Questo è il motivo per cui Deque è stato progettato e non richiede alcuna chiamata a size() .

Il supporto di Collections è bello, ma l'unica cosa che ho trovato che è stata implementata in Collections ma non Arrays era una funzione shuffle() , che è abbastanza semplice per un programmatore esperto da implementare (o delegare a Collections , poiché l'overhead per gli array non primitivi non è male IMO).

Sento che tutto ciò che uno avrebbe bisogno di un List per può essere meglio riempito da un Deque o da un array. Ho fatto qualche ricerca per confronti, ma le uniche informazioni Ho scoperto che in realtà non discute di Deque s o è scritto come una cosa di "Benvenuto in programmazione" e non offre un confronto diretto dei casi d'uso. Ho controllato il mio codice negli ultimi anni e non ho trovato List s al di fuori degli elementi dell'interfaccia utente; Di solito uso un Set o un BlockingQueue per la memorizzazione di dati a lunghezza variabile.

    
posta ndm13 02.02.2018 - 18:14
fonte

2 risposte

8

A List è generale e flessibile.

Le strutture generalizzate sono ideali per i valori di ritorno nelle applicazioni aziendali, web e desktop. Non è ottimale restituire un Deque o un Array se i tuoi consumatori si convertono in List nella maggior parte dei casi comunque . È potenzialmente meno efficiente. E ingombra le codebase dei tuoi consumatori con le conversioni di boilerplate e / o le librerie di utility per gestire le tue interfacce "più efficienti".

Per essere chiari: alcune strutture, come Deque e Array 'sono sicuramente più efficienti per particolari casi d'uso , ma un List è sufficientemente efficiente per la maggior parte dei casi d'uso . List può essere sovrautilizzato. Tuttavia, in molti domini, il risultato in termini di prestazioni dell'utilizzo di List su una struttura più adatta è trascurabile - non vale nemmeno la pena di pensarci due volte.

Compone quello con lo sforzo di lavoro rispetto al valore aziendale: scegliere una struttura dati che supporti l'interfaccia precisa di cui ho bisogno e non più richiede sforzo mentale e tempo . E quelli sono costi per l'azienda. A volte c'è un corrispondente aumento di valore. Tuttavia, in molte applicazioni non c'è, né l'azienda né i clienti vedranno alcuna differenza se scambiate il List out per un Deque più ottimizzato quando si eseguono il piping di 50 righe dal database attraverso il modello in il tuo punto di vista. (O qualunque altra cosa.)

Detto questo, sono casi d'uso ben serviti da List .

Il "bisogno" di un List è più ovvio in applicazioni di stato a vita lunga, in cui le collezioni possono restare in contatto e subire variazioni per un lungo periodo di tempo. Un editor di testo, ad esempio, non dovrebbe creare automaticamente una matrice data[MAX_ROWS][MAX_COLS] di matrici. E, certamente potrebbe creare una serie di array con alcune dimensioni e comportamenti di ridimensionamento e aggiungere metodi per inserimenti ed eliminazioni. Ma questo è esattamente ciò che l'interfaccia List già fa per te. (E l'implementazione esistente è già ben testata e ottimizzata!)

I miei "2 centesimi": a meno che il tuo dominio sia piccolo, molto ben definito o critico dal punto di vista delle prestazioni, inizia con le raccolte generali e ottimizza in seguito. La flessibilità è preziosa per la maggior parte delle applicazioni aziendali e web. Considerando che il margine di prestazione è trascurabile.

E non dimenticare le applicazioni stateful, dove un'interfaccia List è più spesso esattamente ciò che finirai con reinventare se hai impostato come predefinito un array o Deque .. .

Esempi di cose in cui si potrebbe favorire l'efficienza rispetto alla flessibilità potrebbero includere codice di sistema (sistema operativo, driver, firmware), una VM o altri tipi di codice di "piattaforma", come l'implementazione DOM interna del browser Web moderno o motore di esecuzione JavaScript.

    
risposta data 02.02.2018 - 19:21
fonte
4

C'è un motivo per usare java.util.List invece di usare java.util.Deque ?

Sì.

java.util.List ha metodi per accedere agli elementi per posizione. java.util.Deque no. Se stai implementando un algoritmo che richiede per accedere agli elementi in base alla posizione, allora Deque non funzionerà. Anche il contropositivo è vero: se il tuo algoritmo ha solo bisogno di guardare gli elementi in sequenza (cioè, se puoi usare Iterator ), e se ha solo bisogno di mutare la sequenza alle due estremità (o una fine, o non del tutto), quindi un Deque funzionerà per te.

Il principio guida è piuttosto semplice: scegli un'interfaccia che definisca i metodi che l'applicazione deve chiamare.

java.util.List è un intefaccia ben progettato con uno scopo chiaro?

IMO, No. Cerca di essere troppe cose diverse. Se voglio che tu chiami la mia funzione che accederà in modo casuale agli elementi della lista, allora io sono non che permetterò di passare solo a qualsiasi List . Ho intenzione di rendere di passare in ArrayList , o forse, se stiamo collaborando a un progetto in cui ha senso avere un sacco di classi personalizzate, definiremo un'interfaccia che definisce esattamente quelle operazioni che il mio codice sta per eseguire sul tuo elenco.

    
risposta data 02.02.2018 - 21:20
fonte

Leggi altre domande sui tag