Creazione di un ArrayList<>

di il
4 risposte

Creazione di un ArrayList<>

Ciao a tutti, non ho capito un cosa sull'argomento in oggetto, ma prima vediamo i codici:

public class NamesProvider
{
    private List<Person> names=null;

    public NamesProvider()
    {
       names=new ArrayList<Person>();
       Person name=new Person ("Paolo Rossi");
       names.add(name);

       name=new Person ("Andrea Verdi ");
       names.add(name);

       name=new Person ("Massimo Bianchi ");
       names.add(name);

       name=new Person ("Luigi Rosa");
       names.add(name);
    }

    public List<Person> getNames()
    {
       return names;
    }
}

public class Person
{
    private String name=null;
 
    public Person (String name) {
        this.name = name;
    }

    public String getName() {
        return name;
    }

    public void setNam(String name) {
        this.name = name;
    }
}
E' stato creato un oggetto “names” che contiene una lista di nomi ordinati nelle seguenti posizioni:
- [0]: "Paolo Rossi"
- [1]: "Andrea Verdi"
- [2]: "Massimo Bianchi"
- [3]: "Luigi Rosa"
Per essere precisi, se non sbaglio, ad ogni posizione corrisponderà un indirizzo di memoria che punta all'oggetto "name" appena istanziato, nel quale troverò le variabili settate con il relativo nome e cognome.
Ora viene il problema...ma se ad ogni istanza di Person utilizzo come reference sempre lo stesso identificatore ("name"), significa che tale oggetto ("name") verrà ogni volta sovrascritto, quindi, visto che tutte le posizioni dell'ArrayList fanno riferimento a "name" dovremmo avere:
- [0]: "Luigi Rosa"
- [1]: "Luigi Rosa"
- [2]: "Luigi Rosa"
- [3]: "Luigi Rosa"
Ad esempio, se volessi recuperare il contenuto in [0] con un "String getName(int position)", dato che in tutte le posizioni dell'ArrayList è allocato lo stesso reference "name" (che dopo l'ultima istanza "vale" Luigi Rosa), potrei passare come argomento un qualsiasi valore tra 0, 1, 2 o 3 che otterrei sempre lo stesso ritorno cioè "Luigi Rosa".
Non capisco dov'è l'errore del mio ragionamento.....(chiedo scusa per la terminologia tecnica non sempre appropriata, spero comunque di essermi spiegato).

4 Risposte

  • Re: Creazione di un ArrayList<>

    Friz02 ha scritto:


    ma se ad ogni istanza di Person utilizzo come reference sempre lo stesso identificatore ("name"), significa che tale oggetto ("name") verrà ogni volta sovrascritto
    No, non conta il nome della variabile. Conta quali/quanti oggetti distinti hai.

    Immagina una variabile reference come se fosse un punto di aggancio con un filo che lo collega ad un oggetto.
    Se fai:

    name=new Person ("Paolo Rossi");

    c'è un filo che collega name a questo oggetto. Se poi fai:

    names.add(name);

    dentro il ArrayList (names) c'è un array e un suo elemento (distinto dal tuo 'name') avrà anch'esso un "filo" che lo collega a quell'oggetto.

    Se assegni a name qualcos'altro:

    name=new Person ("Andrea Verdi");

    Semplicemente hai "tagliato" il filo che prima collegava name all'oggetto Persona "Paolo Rossi" e hai creato un nuovo collegamento verso il nuovo oggetto Persona "Andrea Verdi".
    Ma, attenzione, nel ArrayList c'è ancora sempre l'elemento che ha il riferimento alla Persona "Paolo Rossi". Il suo "filo" non l'hai minimamente toccato!

    Se hai capito questo .... hai capito le variabili di tipo reference.
  • Re: Creazione di un ArrayList<>

    Ok....capito...credevo che l'elemento dentro l'ArrayList avesse lo stesso riferimento del reference name, in realtà l'elemento dell'ArrayList ha un collegamento ("filo") distinto che lo lega all'oggetto name. Ora tutto torna.
    Grazie.
  • Re: Creazione di un ArrayList<>

    Friz02 ha scritto:


    Ok....capito...credevo che l'elemento dentro l'ArrayList avesse lo stesso riferimento del reference name, in realtà l'elemento dell'ArrayList ha un collegamento ("filo") distinto che lo lega all'oggetto name. Ora tutto torna.
    Grazie.
    Alt! io ho voluto spiegartelo in maniera semplice e poco tecnica per farti capire. E speravo non equivocassi il senso. La realtà è che un reference è comunque pur sempre un valore, sebbene per il programmatore java non serve sapere quanto vale, quanto occupa in bit a runtime (questo dipende dalla implementazione della JVM) ecc...

    Se due variabili reference hanno lo stesso valore, vuol dire che puntano (cioè fanno riferimento) allo stesso identico oggetto. Ma il punto è proprio il fatto che sono variabili distinte, se cambi il reference di una variabile, facendo puntare ad un altro oggetto, l'altra variabile continua a fare riferimento all'oggetto a cui faceva riferimento prima.

    Se il tuo name fa riferimento ad un Persona "Paolo Rossi" e tu lo aggiungi nel ArrayList, qui dentro ci sarà l'array con una variabile (l'elemento dell'array) con una copia del valore di questo reference. Se tu cambi name assegnando un altro Persona, l'elemento nell'array in ArrayList continua a fare riferimento a "Paolo Rossi".

    Stop, è proprio tutto qui!
  • Re: Creazione di un ArrayList<>

    Ho capito, ora sei stato ancora più chiaro...effettivamente mi era sfuggito un piccolo passaggio.
Devi accedere o registrarti per scrivere nel forum
4 risposte