In Java, c'è un modo per troncare un array senza doverne fare una copia? L'idioma comune è Arrays.copyOf(foo, n)
(dove il nuovo array è n elementi lunghi). Non penso ci sia un'alternativa, ma sono curioso di sapere se esiste un approccio migliore.Tronca un array senza copiarlo?
risposta
La lunghezza di una matrice in Java non può essere modificata dopo l'inizializzazione, quindi è necessario eseguire una copia con la nuova dimensione. In realtà, il parametro length di un array Java viene dichiarato come finale, quindi non può essere modificato una volta impostato.
Se è necessario modificare le dimensioni di un array, utilizzare ArrayList.
Non ci credo. Un array viene allocato come un blocco contiguo di memoria e non riesco a immaginare che esista un modo per rilasciare una parte di quel blocco.
succintamente: No, non c'è, per quanto ne so. Un array Java è una struttura dati a dimensione fissa. L'unico modo per ridimensionare "logicamente" è creare un nuovo array e copiare gli elementi ricercati nel nuovo array.
Invece: è possibile (eventualmente) implementare una classe che avvolge una matrice in una raccolta e utilizza una variabile "dimensione" per ridurre logicamente la lunghezza della matrice senza effettivamente copiare i valori. Questo approccio ha un'utilità limitata ... L'unico caso in cui riesco a immaginare dove sia pratico è quando si ha a che fare con un enorme array, che non può essere copiato a causa dei limiti di memoria.
La copia di un array è relativamente poco dispendiosa in termini di tempo ... a meno che non lo facciate milioni di volte, nel qual caso probabilmente è necessario pensare a un algoritmo per evitarlo, e non sprecare il vostro tempo ad andare in giro con un "array a lunghezza variabile".
E ovviamente ... si può semplicemente usare un ArrayList. Sì?
Ci stavo pensando un po 'di più ... e solo per i calci, che ne dici di qualcosa come il sotto.
Nota: Questo è solo un "può essere fatto?" esercizio intellettuale nell'hacking di Java. Chiunque tenti di utilizzare effettivamente questa idea nel codice di produzione meriterà tutto il dolore che seguirà senza dubbio.
public class Foo
{
private static byte[] array = new byte[10];
public static void main(String[] arg) throws Exception
{
Field field = Unsafe.class.getDeclaredField("theUnsafe");
field.setAccessible(true);
Unsafe unsafe = (Unsafe) field.get(null);
Field arrayField = Foo.class.getDeclaredField("array");
long ptr = unsafe.staticFieldOffset(arrayField);
// doesn't work... there's gotta be a way though!
unsafe.reallocateMemory(ptr, 5);
System.out.println("New array size is: " + array.length);
}
}
- 1. Come restituire un array da un'estensione PHP, senza copiarlo in memoria?
- 2. R: Tronca stringa senza parole scissione
- 3. Perché il blocco Objective-C funziona ancora senza copiarlo nell'heap?
- 4. Tronca un float in Erlang
- 5. Come posso creare una macro che usa un valore più volte, senza copiarlo?
- 6. Tronca un elenco per un dato numero di elementi
- 7. Trigger SQL su Tronca
- 8. Rails tronca con un commutatore "leggi altro"
- 9. log4j tronca stacktrace
- 10. Perl: taglia un array, senza creare un intero nuovo array
- 11. Tronca solo ora/minuto
- 12. L'API YouTube tronca i video [PHP]
- 13. Come si può includere/fare riferimento a un file in un progetto senza copiarlo nella directory del progetto?
- 14. Heroku tronca le risposte HTTP?
- 15. XmlDocument.WriteTo tronca il file risultante
- 16. Binding non ha un metodo Clone, qual è un modo efficace per copiarlo
- 17. Tronca data per l'anno fiscale
- 18. Come stampare un array Numpy senza parentesi?
- 19. Implode un array senza primo elemento
- 20. Conversione array int ad array di stringhe in NumPy senza troncamento
- 21. Tronca stringa quando è troppo lungo
- 22. Tronca la frase a un certo numero di parole
- 23. Esiste un algoritmo O (n) per generare un array senza prefisso per un array intero positivo?
- 24. Creare un array monotonico numpy senza un loop Python
- 25. POST un array da un modulo HTML senza javascript
- 26. Tronca una larghezza NSS alla larghezza
- 27. bash: Tronca nomi dei file, mantenendo uniche
- 28. Tronca i collegamenti lunghi in Bootstrap
- 29. Change chiave array senza fine
- 30. Toad che tronca/arrotonda grandi numeri Oracle?
+1, Gli arraylists sono molto carini se si sta tentando di manipolare la dimensione delle cose o rimuovere gli elementi in modo efficiente. – Brian