Hubo una decisión de diseño que tomar desde el principio en Java:
¿Son las matrices primitivas? o son objetos?
La respuesta es, tampoco realmente ... o ambas si lo miras de otra manera. Trabajan bastante estrechamente con el sistema en sí y el backend de la jvm.
Un ejemplo de esto es el método java.lang.System.arraycopy () que necesita tomar una matriz de cualquier tipo. Por lo tanto, la matriz necesita poder heredar algo y eso es un Objeto. Y arraycopy es un método nativo.
Las matrices son también divertido, ya que pueden contener primitivas ( int
, char
, double
, etc ... mientras que las otras colecciones sólo pueden contener objetos. Mira, por ejemplo, en java.util.Arrays y lo feo de los Iguales métodos. Este se puso en como un pensamiento posterior, deepEquals (Object [], Object []) no se agregó hasta 1.5 mientras que el resto de la clase Arrays se agregó en 1.2.
Debido a que estos objetos son matrices , le permiten hacer algunas cosas en la memoria o cerca del nivel de memoria, algo que Java a menudo oculta del codificador. Esto permite que ciertas cosas se hagan más rápido a expensas de romper principalmente el modelo de objetos.
Al principio del sistema hubo una compensación entre flexibilidad y cierto rendimiento. El rendimiento ganó y la falta de flexibilidad se vio envuelta en varias colecciones. Las matrices en Java son un objeto poco implementado sobre un tipo primitivo (originalmente) destinado a trabajar con el sistema cuando lo necesita.
En su mayor parte, los arreglos en bruto fueron cosas que parece que los diseñadores originales intentaron ignorar y guardar solo en el sistema. Y querían que fuera rápido (los primeros Java tenían algunos problemas con la velocidad). Fue una verruga en el diseño que las matrices no son matrices agradables, pero era necesaria cuando se quería exponer algo lo más cerca posible del sistema. Para el caso, los lenguajes contemporáneos de los primeros Java también tienen esta verruga: no se puede hacer nada .equals()
en la matriz de C ++.
Java y C ++ tomaron la misma ruta para las matrices: una biblioteca externa que realiza las operaciones según sea necesario en las matrices en lugar de las matrices ... y sugiere a los codificadores que usen tipos nativos mejores a menos que realmente sepan lo que están haciendo y por qué lo hacen. haciéndolo de esa manera.
Por lo tanto, el enfoque de implantación de .equals en una matriz es incorrecto, pero es el mismo error que los codificadores procedentes de C ++ conocían. Por lo tanto, elija la cosa menos incorrecta en términos de rendimiento: déjelo como la implementación de Object: dos objetos son iguales si y solo se refieren al mismo objeto.
Necesita que la matriz sea una estructura primitiva como para poder comunicarse con enlaces nativos, algo lo más cercano posible a la matriz C clásica. Pero a diferencia de las otras primitivas, necesita que la matriz se pueda pasar como referencia y, por lo tanto, como un Objeto. Por lo tanto, es más primitivo con algunos hacks de objetos en el lateral y algunas comprobaciones de límites.