Javabeg ha scritto:
Praticamente devo ricreare un nuovo Array ogni volta anche se è già allocato in memoria...
Certo, ma lo hai precisato tu espressamente: vuoi avere dati differenti tra i due ArrayList!
[[Hello1, Hello2], [Ciao1, Ciao2]]
Quindi per forza devi avere 2 ArrayList<String>
distinti referenziati dal ArrayList<ArrayList<String>> principale.
Javabeg ha scritto:
credevo che riallocare lo spazio ogni volta fosse uno spreco di risorse oltre che creare un rallentamento del sistema.
Stiamo parlando di 2 oggetti ArrayList ..... non del software della NASA ....
Scherzi a parte, certamente avere un numero enorme di oggetti potrebbe essere un problema ma bisogna sempre vedere cosa si deve fare, come lo si fa, con quali logiche/algoritmi, ecc...
Nel tuo caso non c'è bisogno di porsi queste questioni.
Javabeg ha scritto:
Non capisco perchè in JAVA non posso riutilizzare delle variabili già allocate in memoria.
Chiariamo: un conto sono le variabili, un altro gli oggetti. Le variabili contengono solo un valore. Nel caso dei tipi primitivi, la variabile contiene un valore numerico usando un numero ben precisato di bit (o un true/false se boolean). Un valore che è ben determinabile, stampabile e manipolabile.
Nel caso dei tipi
reference la variabile contiene un "riferimento" (una sorta di indirizzo) che però è molto "opaco", cioè di cui non sai nulla e che non si può manipolare in altri modi (differentemente dal C/C++). L'unica cosa che si sa è che può essere null (=nessun oggetto) oppure può contenere un riferimento ad un oggetto.
Due variabili diverse possono fare riferimento allo stesso oggetto:
ArrayList<String> arr1 = new ArrayList<String>();
ArrayList<String> arr2 = arr1;
Qui hai 2 variabili distinte ma che referenziano lo STESSO oggetto. Questo oggetto lo puoi modificare usando entrambe le variabili.
arr1.add("bla");
oppure
arr2.add("bla");
sarebbe la stessa cosa.
Ma le variabili le puoi anche riusare, avendo ben chiaro come gestire gli oggetti.
ArrayList<ArrayList<String>> arr = new ArrayList<ArrayList<String>>();
ArrayList<String> subarr = new ArrayList<String>();
subarr.add("Hello");
arr.add(subarr);
subarr = new ArrayList<String>(); // riusi la stessa variabile
subarr.add("Ciao");
arr.add(subarr);
Nella riga indicata "riusi la stessa variabile" assegni un
nuovo oggetto ArrayList alla variabile subarr. L'oggetto che era referenziato in precedenza in realtà non lo "perdi" perché lo hai inserito in arr.