Innanzitutto c'è il problema "materiale" della dimensione del heap. Per default tipicamente è di 64 MB (o giù di lì a seconda forse della versione di Java). Come ho già detto, perlomeno nella JVM della Sun 1 boolean occupa 1 byte, quindi se chiedi di istanziare un array di 1000000000 boolean, puoi usare qualunque tecnica/sistema/classe tu voglia ma con un heap massimo al default di 64 MB non ci cavi un bel niente.Originariamente inviato da AF.D.O.C
Ovvero: se inserisco 1000000000 di elementi in un'array di booleani nel modo più classico possibile ad un certo punto ci sarà eccezione dello heap
Quindi per prima cosa: bisogna aumentare la dimensione massima del heap. E questo si può fare con la opzione -XmxNNN dell'eseguibile java (nota: -Xmx è una opzione non standard). Vedere documentazione Sun.
1000000000 vuol dire 1 miliardo .... quindi un bel heap e ci vuole anche una certa memoria fisica installata.
Innanzitutto non c'è alcun "trucco". A patto di poter espandere l'heap a sufficienza, nessuno ti vieta poi di istanziare un array di 1 miliardo di boolean.Originariamente inviato da AF.D.O.C
Il trucco stà nel riuscire a inserire questi elementi in un'array di booleani senza lanciare eccezione.
Semmai la questione è un'altra e sbuca fuori nel caso tu voglia ridimensionare l'array. Hai un array di 10000 boolean e vuoi aggiungerne altri 100. Gli array, una volta istanziati, non si ridimensionano!! Devi per forza istanziare un altro array di es. 10100 boolean e poi ricopiare i 10000 originali nel nuovo array, quindi "perdere" il riferimento all'array vecchio e tenere solo il riferimento al nuovo array.
Quale è il problema? Mi pare evidente: in quella frazione di tempo hai allocati 10000 + 10100 boolean!!! Praticamente almeno il doppio. L'esempio l'ho fatto con numeri non enormi ma inizia a pensare di ridimensionare array davvero molto più grandi ....
Una tecnica che evita questo problema sarebbe la "segmentazione" dell'array che per gestirla bene sarebbe meglio "incapsularla" dentro una classe.
Se segmenti l'array, non hai più un unico enorme array, ma tanti piccoli segmenti, diciamo per esempio di 1024 boolean l'uno.
Se hai bisogno di altri 2048 boolean non hai bisogno di istanziare un array di 3072 boolean ma solo 2 in più da 1024 e quello iniziale oltretutto non lo perdi nemmeno.
Ed è chiaro che così, dato un indice 'i' non puoi accedere subito direttamente .... hai tanti array separati. Ma lo fai usando un array principale che "mappa" gli altri sotto-array.
Un indice es. 1780 vuol dire che devi andare nel 2° blocco da 1024 e prendere l'elemento all'indice 756.
Bastano solo pochi calcoli e puoi gestire il tutto. Ovviamente richiede qualche sforzo in più. Ma evita il problema del ridimensionamento.
E ripeto: è tutto qui, non c'è alcun "barbatrucco" (e la tecnica della segmentazione non lo vedo come un barbatrucco).