Las matrices en java tienen una longitud fija. Entonces, ¿por qué Java permite matrices de tamaño 0?
String[] strings = new String[0];
Significa que está vacío. Es decir, puede recorrerlo como si tuviera elementos y no se produce ningún resultado:
for(int k = 0; k < strings.length; k++){
// something
}
Evitando así la necesidad de comprobar. Si la matriz en cuestión lo fuera null
, se produciría una excepción, pero en este caso simplemente no hace nada, lo que puede ser apropiado.
test(Object... objects)
explícitamente a una función cuando hay una funcióntest()
¿Por qué Java permite matrices de tamaño 1? ¿No es bastante inútil envolver un solo valor en una matriz? ¿No sería suficiente si Java solo permitiera matrices de tamaño 2 o mayor?
Sí, podemos pasar en
null
lugar de una matriz vacía y un único objeto o primitivo en lugar de una matriz de tamaño uno.Pero hay algunos buenos argumentos en contra de tal restricción. Mis principales argumentos personales:
La restricción es demasiado complicada y no es realmente necesaria
Para limitar las matrices a tamaños [1..INTEGER.MAX_INT] tendríamos que agregar
muchas comprobaciones adicionales,(de acuerdo con el comentario de Konrads) lógica de conversión y sobrecargas de métodos a nuestro código. Excluir 0 (y quizás 1) de los tamaños de matriz permitidos no ahorra costos, requiere un esfuerzo adicional y tiene un impacto negativo en el rendimiento.Vector de modelos de matriz
Una matriz es un buen modelo de datos para un vector (¡matemáticas, no la
Vector
clase!). Y, por supuesto, un vector en matemáticas puede ser de dimensión cero. Que es conceptualmente diferente de ser inexistente.Nota al margen : una envoltura prominente para una matriz (char-) es la
String
clase. Lo inmutableString
materializa el concepto de arreglo vacío: es el String vacío (""
).fuente
>= 0
a> 0
). Pero, por supuesto, tiene razón sobre el resto, por lo que agregar esta restricción no sería significativo.A veces es mucho más amigable devolver una matriz de tamaño cero que nula.
fuente
Considere esto (una explicación más detallada de la respuesta de Noon):
public String[] getStrings() { if( foo ) { return null; } else { return new String[] {"bar, "baz"}; } } String[] strings = getStrings(); if (strings != null) { for (String s : strings) { blah(s); } }
Ahora compárelo con esto:
public String[] getStrings() { if( foo ) { return new String[0]; } else { return new String[] {"bar, "baz"}; } } // the if block is not necessary anymore String[] strings = getStrings(); for (String s : strings) { blah(s); }
Esto (devolver matrices vacías en lugar de valores nulos) es de hecho una de las mejores prácticas en el mundo del diseño de API de Java.
Además, en Java, puede convertir Listas (por ejemplo, ArrayList) en matrices y solo tiene sentido convertir una lista vacía en una matriz vacía.
fuente
Al igual que C ++, permite un manejo más limpio cuando no hay datos.
fuente
Otro caso en el que una matriz de longitud cero puede ser útil: para devolver una matriz que contiene todos los elementos de una lista:
Se puede usar una matriz de longitud cero para pasar el tipo de matriz a este método. Por ejemplo:
ClassA[ ] result = list.toArray(new ClassA[0]);
Una matriz de longitud cero sigue siendo una instancia de Object que contiene elementos cero.
fuente
Un caso en el que puedo pensar en el que una matriz vacía es extremadamente útil es usarla en lugar de nulo en una situación en la que no se permite nulo. Un posible ejemplo de eso es un BlockingQueue de matrices. Cuando desee señalar el final de la entrada al lado de lectura, ¿qué haría? Enviar nulos parece una opción obvia, pero el problema es que BlockingQueue no acepta nulos. Podrías envolver tu arreglo dentro de una clase con "
boolean last;
" tipo de campo, pero eso es un poco exagerado. Enviar una matriz vacía (de tamaño cero) parece la opción más razonable.fuente
Otro caso en el que una matriz de longitud cero es útil es cuando se copia una matriz bidimensional. Puedo escribir:
public int[][] copyArray(int[][] array){ int[][] newArray = new int[array.length][0]; for(int i=0;i<array.length;i++){ newArray[i] = array[i]; } return newArray;
Dado que cada referencia de matriz en la matriz se sobrescribe, es más eficiente inicializarlas como referencias a matrices de longitud cero.
fuente
Una longitud 0
byte[]
, ochar[]
puede representar un vacíoString
, que es distinto denull
. Obtener los bytes, o caracteres, como matrices de cadenas (usandogetBytes()
,getChars()
deString
clase, etc.) y viceversa de formarString
sbyte[]
,char[]
es bastante común. Por ejemplo, para codificación personalizada, decodificación de cadenas.fuente