J'enseignerai peut-être bientôt un "cours intensif Java". Bien qu'il soit probablement prudent de supposer que les membres de l'auditoire connaissent la notation Big-O, il n'est probablement pas prudent de supposer qu'ils connaîtront l'ordre des différentes opérations sur les différentes implémentations de collection.
Je pourrais prendre le temps de générer moi-même une matrice récapitulative, mais si elle est déjà quelque part dans le domaine public, j'aimerais certainement la réutiliser (avec le crédit approprié, bien sûr).
Quelqu'un at-il des pointeurs?
Ce site est très bon mais pas spécifique à Java: http://bigocheatsheet.com/
Le livre Java Generics and Collections contient ces informations (pages: 188, 211, 222, 240).
Répertorier les implémentations:
get add contains next remove(0) iterator.remove
ArrayList O(1) O(1) O(n) O(1) O(n) O(n)
LinkedList O(n) O(1) O(n) O(1) O(1) O(1)
CopyOnWrite-ArrayList O(1) O(n) O(n) O(1) O(n) O(n)
Définir les implémentations:
add contains next notes
HashSet O(1) O(1) O(h/n) h is the table capacity
LinkedHashSet O(1) O(1) O(1)
CopyOnWriteArraySet O(n) O(n) O(1)
EnumSet O(1) O(1) O(1)
TreeSet O(log n) O(log n) O(log n)
ConcurrentSkipListSet O(log n) O(log n) O(1)
Implémentations de la carte:
get containsKey next Notes
HashMap O(1) O(1) O(h/n) h is the table capacity
LinkedHashMap O(1) O(1) O(1)
IdentityHashMap O(1) O(1) O(h/n) h is the table capacity
EnumMap O(1) O(1) O(1)
TreeMap O(log n) O(log n) O(log n)
ConcurrentHashMap O(1) O(1) O(h/n) h is the table capacity
ConcurrentSkipListMap O(log n) O(log n) O(1)
Implémentations de la file d'attente:
offer peek poll size
PriorityQueue O(log n) O(1) O(log n) O(1)
ConcurrentLinkedQueue O(1) O(1) O(1) O(n)
ArrayBlockingQueue O(1) O(1) O(1) O(1)
LinkedBlockingQueue O(1) O(1) O(1) O(1)
PriorityBlockingQueue O(log n) O(1) O(log n) O(1)
DelayQueue O(log n) O(1) O(log n) O(1)
LinkedList O(1) O(1) O(1) O(1)
ArrayDeque O(1) O(1) O(1) O(1)
LinkedBlockingDeque O(1) O(1) O(1) O(1)
Le bas du fichier javadoc du package Java.util contient de bons liens:
Les Javadocs de Sun pour chaque classe de collecte vous indiqueront exactement ce que vous voulez. HashMap , par exemple:
Cette implémentation fournit des performances à temps constant pour les opérations de base (get et put), en supposant que la fonction de hachage disperse correctement les éléments entre les compartiments. L'itération sur les vues de collection nécessite un temps proportionnel à la "capacité" de l'instance HashMap (le nombre de compartiments) plus sa taille (le nombre de valeurs clé mappages).
TreeMap :
Cette implémentation fournit un coût en temps de log (n) garanti pour les opérations containsKey, get, put et remove.
TreeSet :
Cette implémentation fournit un coût en temps de log (n) garanti pour les opérations de base (ajout, suppression et contenu).
(c'est moi qui souligne)
Le gars ci-dessus a donné une comparaison entre HashMap/HashSet et TreeMap/TreeSet.
Je vais parler de ArrayList vs LinkedList:
Liste des tableaux:
get()
add()
_ListIterator.add()
ou Iterator.remove()
, il sera O(n)) pour déplacer tous les éléments suivantsLinkedList:
get()
add()
ListIterator.add()
ou Iterator.remove()
, ce sera O (1)