In OpenJDK 1.8, java.util.ArrayList#sort(Comparator)
non copia la sua matrice interna; si ordina sul posto, come suggerisci dovrebbe.
L'attuazione di java.util.List#sort()
che stai criticando ha la seguente documentazione di accompagnamento:
L'implementazione predefinita ottiene un array contenente tutti gli elementi in questo elenco, ordina l'array e itera su questa lista reset ogni elemento da la posizione corrispondente nella matrice. (Questo evita la n² log (n) prestazioni che deriverebbe dal tentativo di ordinare una lista collegata al suo posto.)
Cioè, copiando la matrice e muoversi con accesso casuale è più efficiente rispetto alla testa di avanzare linearmente in una lista collegata. L'implementazione comune tenta di scambiare l'overhead di copia per l'overhead di accesso agli elementi. Per casi come ArrayList
in cui la copia non è necessaria per ottenere lo stesso accesso casuale agli elementi, la libreria omette la copia sovrascrivendo il metodo.
un interessante confronto: Guarda std::sort()
e std::list::sort()
funzioni del ++ libreria standard C:
std::sort()
Richiede parametri che delimitano un intervallo con accesso casuale.
std::list::sort()
Si presuppone solo accesso lineare attraversando i nodi dell'elenco collegati.
Il generico std::sort()
algoritmo è più efficiente, ma la biblioteca osta definendolo su un std::list
(che è una lista collegata, simile a Java di java.util.LinkedList
). La libreria offre un mezzo meno efficiente per ordinare uno std::list
per comodità. A differenza della libreria Java, la libreria C++ non copia uno std::list()
in una matrice per utilizzare l'algoritmo di accesso casuale std::sort()
.
Esistono molte implementazioni di elenchi, inclusi elenchi concatenati, in cui l'ordinamento dell'elenco può essere più costoso. –
"Sembra che sia possibile non copiare i valori nell'array nel caso di ArrayList." - ed è esattamente come è fatto. – xehpuk
Grazie per la rapida risposta. –