Uso di length nei cicli

di il
3 risposte

Uso di length nei cicli

Non uso Java come ambiente principale; guardando il lavoro di un utente ho visto qualcosa del genere
public static int[] reverseArray(int[] array) {
        if (array == null) {
            return null;
        }

        int[] resultArray = new int[array.length];

        for (int i = 0; i < array.length; i++) {
            resultArray[i] = array[array.length - 1 - i];
        }

return resultArray;
Length è una proprietà o un "metodo nascosto da proprietà" invocato ad ogni iterazione, o "magicamente" il compilatore/interprete bytecode riesce a capire che in realtà è una costante?

Giusto una curiosità.

EDIT: vabbè è la capacità non il numero di elementi, quindi suppongo sia una "vera" proprietà, ma non sono certo al 100%

3 Risposte

  • Re: Uso di length nei cicli

    +m+ ha scritto:


    è la capacità non il numero di elementi
    Ma è la stessa cosa ...

    +m+ ha scritto:


    quindi suppongo sia una "vera" proprietà, ma non sono certo al 100%
    Dal Java Language Specification: "The array's length is available as a final instance variable length."
    Tuttavia, a livello di bytecode (quello che c'è compilato nel .class), viene usata una istruzione apposita esclusivamente per l'accesso alla lunghezza di un array. Quindi comunque la lunghezza di un array non viene trattata come "qualunque" altro campo.

    E inoltre tramite "reflection" non è possibile osservare il campo length degli array.
  • Re: Uso di length nei cicli

    andbin ha scritto:


    +m+ ha scritto:


    è la capacità non il numero di elementi
    Ma è la stessa cosa ...

    +m+ ha scritto:


    quindi suppongo sia una "vera" proprietà, ma non sono certo al 100%
    Dal Java Language Specification: "The array's length is available as a final instance variable length."
    Tuttavia, a livello di bytecode (quello che c'è compilato nel .class), viene usata una istruzione apposita esclusivamente per l'accesso alla lunghezza di un array. Quindi comunque la lunghezza di un array non viene trattata come "qualunque" altro campo.

    E inoltre tramite "reflection" non è possibile osservare il campo length degli array.
    Lo è perchè si tratta, ragionevolmente, di un vettore di elementi che sono memorizzati contiguamente, un vero array, altrimenti length, size e capacity non necessariamente sono sinonimi.

    Tornando alla domanda (di un tuo esempio) è relativa all'utilizzo di una variabile da parte della JVM (il che quindi non determina rallentamenti particolari durante l'esecuzione del ciclo), oppure di un metodo (il quale potrebbe - ma non nel caso di un array di interi ragionevolmente - "contare" in concreto gli elementi effettivamente presenti).
  • Re: Uso di length nei cicli

    +m+ ha scritto:


    Lo è perchè si tratta, ragionevolmente, di un vettore di elementi che sono memorizzati contiguamente, un vero array, altrimenti length, size e capacity non necessariamente sono sinonimi.
    Non confondere gli array con le collezioni (in particolare quelle collezioni basate su array che lavorano a capacità più espansa rispetto al numero "logico" di elementi).
    In Java se si istanzia un array di lunghezza 10, vuol dire che la capacità è 10 ed ha quindi 10 elementi.

    +m+ ha scritto:


    Tornando alla domanda (di un tuo esempio) è relativa all'utilizzo di una variabile da parte della JVM (il che quindi non determina rallentamenti particolari durante l'esecuzione del ciclo), oppure di un metodo (il quale potrebbe - ma non nel caso di un array di interi ragionevolmente - "contare" in concreto gli elementi effettivamente presenti).
    A livello di bytecode (ripeto, quello c'è e si vede nel .class) ogni volta che si referenzia unArray.length viene usata quella istruzione speciale apposita per ottenere la lunghezza dall'oggetto dell'array.
    Poi cosa succeda quando il JIT (Just in Time) compiler traduce il bytecode nel codice macchina del processore fisico ... non lo so di preciso (sono dettagli molto avanzati ... non mi sono mai documentato più di tanto) ma fa sicuramente ragionamenti più "smart" di quanto si possa pensare.
Devi accedere o registrarti per scrivere nel forum
3 risposte