C'era una decisione progettuale da prendere in anticipo in Java:
Are arrays primitives? or are they Objects?
La risposta è, né davvero ... o entrambi, se la guardi in un altro modo. Funzionano abbastanza strettamente con il sistema stesso e il back-end del jvm.
Un esempio di questo è java.lang.System.arraycopy () metodo che deve prendere un array di qualsiasi tipo. Pertanto, l'array deve essere in grado di ereditare qualcosa e questo è un Oggetto. E arraycopy è un metodo nativo.
Gli array sono anche divertenti in quanto possono contenere primitive ( int
, char
, double
, ecc ... mentre le altre collezioni possono contenere solo oggetti. Guarda, ad esempio, a java.util.Arrays e il brutto dei metodi equivalenti. dopo aver pensato. deepEquals (Object [], Object []) non è stato aggiunto fino a 1,5 mentre il resto della classe Arrays è stato aggiunto in 1.2.
Poiché questi oggetti sono matrici , ti permettono di fare alcune cose che sono in memoria o vicino al livello di memoria - qualcosa che Java spesso nasconde dal codificatore. Ciò consente che alcune cose vengano fatte più velocemente a scapito della rottura del modello di oggetto.
C'è stato un compromesso all'inizio del sistema tra la flessibilità e alcune prestazioni. Le prestazioni vinsero e la mancanza di flessibilità fu avvolta nelle varie collezioni. Le matrici in Java sono un oggetto implementato in modo sottile su un tipo primitivo (originariamente) progettato per funzionare con il sistema quando ne hai bisogno.
Per la maggior parte, gli array grezzi erano cose che sembra che i progettisti originali cercassero di ignorare e riporre solo nel sistema. E volevano che fosse veloce (presto Java aveva alcuni problemi con la velocità). Era una verruca sul design che gli array non fossero matrici carine, ma era necessario quando si voleva esporre qualcosa il più vicino possibile al sistema. Del resto, i linguaggi contemporanei dei primi Java hanno questa verruca - non si può fare un .equals()
sull'array del C ++.
Sia Java che C ++ hanno preso lo stesso percorso per gli array: una libreria esterna che esegue le operazioni secondo necessità sugli array piuttosto che sugli array ... e suggerisce ai programmatori di utilizzare tipi nativi migliori, a meno che non realmente sapere cosa stanno facendo e perché lo stanno facendo in quel modo.
Quindi, l'approccio che impianta. equals in un array è sbagliato, ma è lo stesso che i codificatori provenienti da C ++ sapevano. Quindi scegli la cosa meno sbagliata in termini di prestazioni - lasciala come implementazione di Object: due oggetti sono uguali se e solo se si riferiscono allo stesso oggetto.
È necessario che l'array sia una struttura primitiva come la possibilità di comunicare con i binding nativi, il più vicino possibile al classico array C. Ma a differenza degli altri primitivi, è necessario che la matrice sia passata come riferimento e quindi come oggetto. Quindi è più di un primitivo con alcuni hack di oggetti sul lato e alcuni limiti di controllo.