Houve uma decisão de design a ser tomada desde o início em Java:
As matrizes são primitivas? ou eles são objetos?
A resposta é: nem realmente ... ou ambos, se você olhar de outra maneira. Eles trabalham bastante próximos ao sistema em si e ao back-end da jvm.
Um exemplo disso é o método java.lang.System.arraycopy () que precisa ter uma matriz de qualquer tipo. Assim, a matriz precisa ser capaz de herdar algo e isso é um Objeto. E arraycopy é um método nativo.
Matrizes são também divertido em que eles podem segurar primitivas ( int
, char
, double
, etc ... enquanto as outras coleções só pode conter objetos. Olhe, por exemplo, na java.util.Arrays eo feio da iguala métodos. Este foi posto em como uma reflexão posterior deepEquals (Object [], Object []) não foi adicionado até 1,5, enquanto o restante da classe Arrays foi adicionado no 1.2.
Porque esses objetos são matrizes , eles permitem que você faça algumas coisas que estão na memória ou quase no nível da memória - algo que o Java geralmente oculta do codificador. Isso permite que certas coisas sejam feitas mais rapidamente às custas de quebrar principalmente o modelo de objetos.
No início do sistema, houve uma troca entre flexibilidade e algum desempenho. O desempenho venceu e a falta de flexibilidade foi envolvida nas várias coleções. Matrizes em Java são um Objeto pouco implementado sobre um tipo primitivo (originalmente) destinado a trabalhar com o sistema quando você precisar.
Na maioria das vezes, matrizes brutas eram coisas que parece que os designers originais tentaram ignorar e esconder apenas no sistema. E eles queriam que fosse rápido (o Java inicial tinha alguns problemas com a velocidade). Era uma verruga no design de matrizes que não são boas matrizes, mas era necessária quando você queria expor algo o mais próximo possível do sistema. Aliás, as linguagens contemporâneas do Java inicial também têm essa verruga - não se pode fazer um .equals()
no array do C ++.
Java e C ++ seguiram o mesmo caminho para matrizes - uma biblioteca externa que executa as operações conforme necessário em matrizes em vez de matrizes ... e sugerindo que os codificadores usem tipos nativos melhores, a menos que realmente saibam o que estão fazendo e por que são. fazendo assim.
Portanto, a abordagem para implantar .equals em uma matriz está errada, mas é a mesma que os codificadores provenientes de C ++ conheciam. Portanto, escolha a coisa menos errada em termos de desempenho - deixe como a implementação de Objeto: dois Objetos são iguais se e somente se estiverem se referindo ao mesmo objeto.
Você precisa que a matriz seja uma estrutura primitiva para poder se comunicar com ligações nativas - algo o mais próximo possível da matriz C clássica. Mas, diferentemente das outras primitivas, você precisa que a matriz possa ser transmitida como referência e, portanto, como um Objeto. Portanto, é mais primitivo, com alguns hackers de objetos ao lado e algumas verificações de limites.