Meglio un Array o una ArrayList come argomento di un metodo?

di il
9 risposte

Meglio un Array o una ArrayList come argomento di un metodo?

Buongiorno,

ho l'esigenza di passare ad un metodo, una sequenza di campi di testo.

Fino ad ora quando sapevo a priori il loro numero ho sempre usato un vettore.
Nel caso in cui invece l'elenco dei campi era variabile usavo una ArrayList, quindi mi servivano due metodi distinti.

Ora invece volevo stardardizzare il più possibile questo meccanismo e mi chiedevo se dal punto di vista delle prestazioni fosse più efficiente usare una Array come String Campi[n] oppure un ArrayList<String> Campi = new ArrayList<>() ;

E se ci sono differenze, sono significative o trascurabili?

Non so se mi sono spiegato. 

9 Risposte

  • Re: Meglio un Array o una ArrayList come argomento di un metodo?

    1) meglio usare “List<String> campi = new ArrayList<>()”  (e' Java NON C#, quindi “campi”, NON “Campi” )

    2) un ArrayList al suo interno usa un array, QUINDI differenze trascurabili

    3) NON E' usando un array O un ArrayList che ti permette di rendere il codice piu' efficiente, MA usando algoritmi PIU' EFFICENTI, evitando di fare due o piu' volte le stesse operazioni, ecc.

  • Re: Meglio un Array o una ArrayList come argomento di un metodo?

    Grazie mille per le tue indicazioni.

    1) hai ragione, è stato solo una svista di digitazione.
    Su questo tipo di convenzioni sono rigorosissimo. Mi sono pure inventato una struttura dei nomi delle varibili per distinguere a colpo d'occhio il loro tipo.

    2) perdona la domanda da incompetente, ma mi chiedo come faccia l'ArrayList ad usare un Array che ha dimensioni fisse, quando un ArrayLIst viene popolato con delle .add asincrone!  Che fa ad ogni add ridefinisce un nuovo array e ci ricopia il vecchio? sarebbe veramente inefficiente!
    E se invece usa solo dei puntatori allora perché hanno inventato gli array a dimensione fissa?
    Cos'è che mi sfugge?

    3) Verissimo! Infatti sto cercando di ristrutturare un mio programma proprio per snellire i flussi e non avere doppioni di codice che fanno le stesse cose, magari con lievi differenze, che per eventuali modifiche diventano oltremodo laboriose e lasciano spazio a eventuali errori sparsi.

  • Re: Meglio un Array o una ArrayList come argomento di un metodo?

    2) ma che bischerata di domanda ;-)

    2.1) ArrayList NON E' threadsafe! Attento a non fare “casini” con le strutture dati e il parallelismo. 

    2.2) implementazione BANALE: usa un array “abbastanza” capiente (che ne so, 128 elementi) ed un contatore che tiene traccia di quanti elementi sono stati memorizzati. Quando arriva a 128, radoppia la dimensione dell'array e continua

    2.3) anche se non li vedi, Java e' praticamente quasi TUTTO a puntatori. Gli unici oggetti NON puntatori sono i tipi primitivi!

    2.4) gli array a dimensione fissa NON LI HANNO INVENTATI, sono la struttura dati BASE su cui TUTTE le altre strutture dati sono costruite, e sono ad un millimetro di distanza dall'hardware fisico (ANCHE se di mezzo c'e' una virtual machine, non cambia niente)

  • Re: Meglio un Array o una ArrayList come argomento di un metodo?

    Grazie mille! Mi rendo conto di avere ancora molto da imparare su Java. 

    Se posso abusare ancora un attimo della tua competenza, non mi torna il punto 2.2 nel senso che come fa a raddoppiare la dimensione dell'array se per definizione un array è a dimensione fissa?

  • Re: Meglio un Array o una ArrayList come argomento di un metodo?

    Effettivamente, non sono stato chiaro ;-)

    NON RADOPPIA la dimensione di QUEL array, ne costruisce un'altro di dimensione doppia e lo riempie con il contenuto del primo, QUINDI butta via il primo e lo rimpiazza con il secondo.

    I problemi di “”efficienza"" li risolvi “dimensionando” opportunamente l'ArrayList durante la sua creazione.
    Comunque stiamo parlando di “microsecondi” o al limite “millisecondi” per riempire un ArrayList con qualche MILIARDO di elementi, uno alla volta. Tempi assolutamente trascurabili ;-)

    Dalle domande che fai, direi che ti mancano i concetti “”fondamentali"".
    Ti conviene approfondire i concetti di “memoria lineare” (quello di “memoria segmentata” al momento lo puoi trascurare perche' viene usato solo in casi abbastanza speciali), di “allocazione della memoria” (c'e' un intero “”universo"" sull'argomento), di “puntatore” e di “garbage collection” (GC).

    Java risolve il 90% dei problemi di allocazione/deallocazion con il GC.
    Rimane un 10% che bisogna studiare ;-)

    Se scrivevi codice in C o C++, per le rogne con l'allocazione della memoria ti strappavi tutti i cappelli che hai intesta (e anche da tutte le altre parti ;-) )

  • Re: Meglio un Array o una ArrayList come argomento di un metodo?

    Si su Java, nonostante lo stia usando da anni, lo trovo ancora estremamente ostico!

    Fai conto che ho iniziatato a programmare 44 anni fa in Fortran IV (dove si usavano i famosi “If ( ) goto label” :-) sui VAX della Digital Equipment Corp. e in Basic interpretato su uno dei primissimi pc con 8KB di RAM

    Poi ho usato l'assembler per l'acquisizione di dati relativi alla pressione arteriosa da un nastro analogico verso un file digitale, le varie versioni successive di Fortran per le attività di ricerca di bioingegneria, poi il C (con cui ho scritto il kernel di un programma di sicurezza per una multinazionale francese) per approdare poi al Visual Basic per la creazione di un mio gestionale Client-Server per la gestione dei centri di assistenza con cui ci facevo lavorare 50 utenti in accesso concorrente e relativa interfaccia web (sempre in VB) per i laboratori sparsi sul territorio nazionale.

    Poi ho deciso di cambiare lavoro ma ho continuato a sviluppare per usi personali e siccome nel frattempo avevo iniziato ad usare Linux ho deciso di cercare di imparare un linguaggio multipiattaforma e ho scelto java, ma lo trovo di una complicatezza esagerata e la OOP mi sta ancora completamente indigesta!

    È per questo che certe cose mi sembrano ancora “strane”.

  • Re: Meglio un Array o una ArrayList come argomento di un metodo?

    Java NON e' ostico, anzi, da un certo punto di vista e' molto (ma molto molto) meglio di altri linguaggi “"orientati agli oggetti”" (in ordine CRESCENTE di complicazione, tanto per fare un esempio: C# e C++).

    Da ex programmatore Fortran/C/assembler/VB (ALIAS programmazione “procedurale” all'ennesima potenza ;-) ) per poter “comprendere” Java devi fare il “cambio di paradigma”: da “programmazione procedurale” a “programmazione ad oggetti”.

    Attento a non confondere:

    1. il paradigma di programmazione (ad oggetti con l'aggiunta di una serie di concetti estremamente comodi quali classi e interfacce e poco altro)
    2. la sintassi usata per supportare il paradigma di programmazione
    3. la (sterminata) libreria al servizio del linguaggio di programmazione
    4. le estensioni al linguaggio per fare “meta-programmazione” (nella fattispecie le ‘annotazioni’) ma che nel 99.9% dei casi “si usano” NON si implementano.

    Fortran, C, assembler avevano (ed ancora oggi “hanno”) quattro librerie messe in croce, ed i linguaggi, proprio per la loro “natura procedurale” hanno una sintassi abbastanza “striminzita”. Da un certo punto di vista il linguaggio piu' complesso e' proprio l'assembler, con i suoi n-mila metodi di indirizzamento, n-mila istruzioni assembler, con le loro n-mila varianti per ogni possibile combinazione di parametri/registri/indirizzi di memoria/…

    La programmazione ad oggetti richiede NON SOLO di capire che cosa sia un'oggetto, una classe, un'interfaccia, o che cosa sia l'ereditarieta' o l'overloading, MA sopprattutto, cambiare “mentalita'”.

    Se vuoi, un “metodo” e' solo un modo diverso di scrivere una funzione.
    Non c'e' “”differenza sintattica"" tra scrivere:

    class MyClass {
       void print(){ printf("Ciao ciccio"}; }
    };
    
    MyClass c = new MyClass();
    c.print();

    e

    struct MyClass { }
    
    void print(MyClass c) { printf("Ciao ciccio"}; } 
    
    MyClass c = new MyClass();
    print(c);

    La differenza e' “semantica” ed ha a che vedere con i concetti della OOP.
    (Nota: in questo specifico caso, la differenza e' ZERO)

    Se vuoi, la versione “”generalizzata"" della programmazione ad oggetti e' quello che viene chiamato “multimetodo”, supportato da Julia (linguaggio di programmazione abbastanza recente che, potenzialmente, dovrebbe andare in sostituzione di Python, in un futuro non troppo remoto).

    https://en.wikipedia.org/wiki/Multiple_dispatch 

    Quindi, visto che non sei proprio “di primo pelo” come supponevo inizialmente ;-) , il consiglio e' quello di approfondire i concetti di programmazione ad oggetti, usando qualche LIBRO, non Wikipedia o le scemenze di videocorsi che trovi su Internet (a meno che non siano corsi SERI di qualche buona/ottima universita').

    Qualcosa tipo questo:

    https://www.amazon.it/Introduction-Object-Oriented-Programming-Timothy-Budd/dp/0201760312/ref=sr_1_3?__mk_it_IT=%C3%85M%C3%85%C5%BD%C3%95%C3%91&crid=Z55BBD1VZGSD&keywords=object+oriented+programming+introduction&qid=1673109681&sprefix=object+oriented+programming+introduction%2Caps%2C253&sr=8-3 

    (costosetto? Embe', se devo consigliare, consiglio “robba seria” ;-) )

    D'altra parte, se e' vero che il “Vero Programmatore”, al contrario del “Mangiatore di Ciocori' ”, che tu dovresti conoscere alla perfezione ;-), fa programmi di contabilita' in Fortran, la programmazione ad oggetti di semplifica non poco la realizzazione di diverse categorie di applicazioni.

    http://web.tiscali.it/vittoriobaroni/ciocori.htm 

    Non e' la pancea di tutti i mali, in certi casi e' anche inutilmente complicata, ma in diversi altri non e' sufficiente.
    Un esempio per tutti: avendo pasticciato con la bioingegneria sai perfettamente che ci sono n-mila tipologie diverse di matrici: quadrate, rettangolari, simmetriche, hermitiane, triangolari superiori/inferiori a bande, diagonali, sparse, dense, ecc.

    Una delle operazioni piu' comuni e' la moltiplicazione tra matrici. Ci sono algoritmi “”efficienti"" che sono in gradi di sfruttare le proprieta' delle matrici per fare la moltiplicazione.

    Con la semplice OOP implementare un meccanismo automatico che scelga l'algoritmo piu' adatto di volta in volta e' "un bagno di sangue" e lacrime".

    Invece mediante il “multidispach”, la cosa sarebbe "“banale”".

  • Re: Meglio un Array o una ArrayList come argomento di un metodo?

    Se vuoi vedere come funziona internamente ArrayList, lo puoi vedere qui

    http://www.docjar.com/html/api/java/util/ArrayList.java.html

  • Re: Meglio un Array o una ArrayList come argomento di un metodo?

    07/01/2023 - migliorabile ha scritto:


    Da ex programmatore Fortran/C/assembler/VB (ALIAS programmazione “procedurale” all'ennesima potenza ;-) ) per poter “comprendere” Java devi fare il “cambio di paradigma”: da “programmazione procedurale” a “programmazione ad oggetti”.

    Carissimo, è proprio questo il punto!   Anni fa iniziai a leggere un manuale sulla OOP ma non sono ancora riuscito a cambiare il famigerato “paradigma”.
    Forse se sviluppassi ancora professionalmente, come quando sviluppavo 364gg/anno, anche in ferie, mentre con una mano muovevo la carrozzina del figlio per farlo dormire e con l'altra digitavo sulla tastiera di uno dei primi portatili in B/N, sarei costretto ad impegnarmi… e probabilmente con grande fatica riuscirei a capirci qualcosa, ma ormai… credo sia della serie “mission impossible”…

    Comunque grazie di cuore per le tue indicazioni e la tua pazienza. ;-)

    Grazie anche Weierstrass.

Devi accedere o registrarti per scrivere nel forum
9 risposte