Questa idea sembra un'alternativa più fresca. Tu preferiresti utilizzarlo al posto di ArrayList<T>
? Se sì, mi piacerebbe afferrarne i motivi.
Principalmente perché è fatta apposta per quello. Java ha anche una classe
Stack, ma è deprecata in favore di Deque: "
A more complete and consistent set of LIFO stack operations is provided by the Deque interface and its implementations, which should be used in preference to this class". In termini di performance ArrayList e ArrayDeque dovrebbero essere pressoché identici, ma la prima è meno pratica da usare mentre la seconda fornisce direttamente l'astrazione dello stack: deque vuol dire stack+queue e noi ci limitiamo ad usare le sue funzionalità da stack, con una list queste astrazioni te le devi costruire a mano e sebbene per lo stack sia molto semplice (e.g., quello che io ho chiamato top, ovvero
deque.getFirst()
, diventa
arraylist[arraylist.size() - 1]
) è comunque meno diretto.
più che grow
quella funzione la chiamerei recreate
Grow è il nome scelto da java per quel tipo di operazione, in C++ si chiama reserve. Semmai top avrei dovuto chiamarlo peek.
Però a mio parere credo sia più utile come rimedio la collezione perchè artefatta e appositamente per quella cosa, e a mio avviso Java non è fatto per gestire la memoria manualmente (se non a scopo didattico fare qualcosa di quel tipo) a meno che bisogna provarsi per qualche memory leak.
Yep. Immagino che ArrayDeque sia implementato usando ArrayList e ArrayList dovrebbe avere un'implementazione molto simile a quella che ho riportato io. Ovviamente è sempre meglio usare le astrazioni che abbiamo creato in precedenza per crearne delle nuove. Chi vuole usare uno stack in java dovrebbe usare quello già implementato dalla libreria standard (Deque). La mia era una risposta didattica a "come si implementa uno stack?" e implementarlo usando altre astrazioni per sembrava poco informativo: a quel punto ci si domanderebbe "come si implementa ArrayList?". Ho seguito l'idea di Excdt77 che è effettivamente quello che avviene under the hood quando usiamo ArrayDeque (o ArrayList).
Dei memory leaks non c'è da preoccuparsi perché java ha un garbage collector: se riesci a causare un memory leak senza hackerare troppo, è un bug della JVM. Comunque sì, java non è ideale per fare le cose a basso livello... ciò non toglie che certe cose si possano fare, infatti i containers della libreria standard sono implementati proprio in questo modo e trovo didattico dargli un'occhiata. Adesso, per esempio, è molto facile capire perché puoi fare un ArrayList di Integer ma non puoi farla di int.