En Java, ¿hay alguna manera de truncar una matriz sin tener que hacer una copia? La expresión común es Arrays.copyOf(foo, n)
(donde la nueva matriz tiene n elementos largos). No creo que haya una alternativa, pero tengo curiosidad sobre si hay un mejor enfoque.Truncar una matriz sin copiarla?
Respuesta
La longitud de una matriz en Java no se puede modificar después de la inicialización, por lo que debe hacer una copia con el nuevo tamaño. En realidad, el parámetro de longitud de una matriz de Java se declara como final, por lo que no se puede cambiar una vez que se ha establecido.
Si necesita cambiar el tamaño de una matriz, usaría una ArrayList.
No lo creo. Una matriz se asigna como un bloque contiguo de memoria, y no puedo imaginar que haya alguna forma de liberar una parte de ese bloque.
Sucintamente: No, no hay, hasta donde yo sé. Una matriz de Java es una estructura de datos de tamaño fijo. La única forma de redimensionarlo "lógicamente" es crear una nueva matriz y copiar los elementos deseados en la nueva matriz.
En su lugar: podría (posiblemente) implementar una clase que envuelve una matriz en una colección y utiliza una variable de "tamaño" para reducir lógicamente la longitud de la matriz sin copiar los valores. Este enfoque tiene una utilidad limitada ... El único caso que puedo imaginar donde es práctico es cuando se trata de una matriz enorme, que simplemente no se puede copiar debido a limitaciones de memoria.
Copiar una matriz es relativamente económico en cuanto al tiempo ... a menos que lo haga millones de veces, en cuyo caso probablemente necesite idear un algoritmo para evitarlo y no perder el tiempo con un "matriz de longitud variable".
Y, por supuesto ... en su lugar, podría usar una ArrayList. ¿Sí?
Estaba pensando en ello un poco más ... y solo por diversión, ¿qué tal algo así como a continuación?
Nota: Esto es solo un "¿se puede hacer?" ejercicio intelectual en hacking de Java. Cualquiera que intente realmente usar esta idea en el código de producción se merecerá todo el dolor que indudablemente seguirá.
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. PHP cómo truncar una matriz
- 2. ¿Cómo truncar fácilmente una matriz con JavaScript?
- 3. ¿Algún sistema operativo permite mover la memoria de una dirección a otra sin copiarla físicamente?
- 4. Cómo truncar los valores de una matriz numpy 2D
- 5. Sin función Truncar en PHP - ¿Opciones?
- 6. Truncar doble sin redondeo en C
- 7. Mostrar texto completo en Excel sin truncar
- 8. R: Truncar cadena sin partiendo palabras
- 9. Truncar Dos lugares decimales sin redondeo
- 10. Python truncar una cadena larga
- 11. Truncar archivo
- 12. Redondeando un doble sin utilizar Redondear o Truncar
- 13. Cómo obtener PhpMyAdmin para eliminar/truncar sin pedir confirmación
- 14. Truncar una cadena sin terminar en el medio de una palabra
- 15. Truncar texto en chino
- 16. Búsqueda en una matriz sin clasificar
- 17. Cómo imprimir una matriz Numpy sin corchetes?
- 18. ¿Truncar una tabla SQLite si existe?
- 19. Cómo truncar una cadena UTF8 en PHP?
- 20. ¿Devolviendo una matriz sin un elemento eliminado? ¿Usar empalme() sin cambiar la matriz?
- 21. ¿Truncar texto en PHP?
- 22. fecha Truncar al ejercicio
- 23. Truncar con la condición
- 24. Devolución de una matriz sin asignar a una variable
- 25. Truncar una lista a un número dado de elementos
- 26. Truncar el archivo al frente
- 27. Transmisión de una matriz de caracteres sin signo a una matriz de flotantes
- 28. Gire una matriz 2D in situ sin utilizar una nueva matriz: ¿la mejor solución de C++?
- 29. Truncar un flotador en Erlang
- 30. C# matriz Combinar Sin duplicados
+1, Las listas de arreglos son muy buenas si está intentando manipular el tamaño de las cosas o eliminar elementos de manera eficiente. – Brian