Java HashSet vs les Performances de la baie
J'ai une collection d'objets qui sont garantis pour être distincte (en particulier, indexée par un entier unique ID). Je sais exactement combien il y en a (et le nombre ne change pas), et je me demandais si le Tableau aurait un notable avantage de performance sur HashSet pour le stockage/récupération de ces éléments.
Sur le papier, le Tableau des garanties de la constante de temps d'insertion (car je sais que la taille à l'avance) et la récupération, mais le code pour HashSet a l'air beaucoup plus propre et ajoute un peu de souplesse, alors je me demandais si je ne suis rien perdre de performance de l'utiliser, au moins, en théorie.
Est votre jeu de données éparses ou dense?
HashSet est conçu pour avoir attendu de la constante de temps
Il y a des millions d'avis sur ce point., javacodegeeks.com/2010/08/... et ibm.com/developerworks/library/j-jtp02183
En fonction du nombre d'articles que vous avez EnumSet ou quelque chose comme ça pourrait être une option.
Jetez un oeil à stackoverflow.com/questions/10196343/...
HashSet est conçu pour avoir attendu de la constante de temps
add
, contains
et remove
opérations, ce qui signifie que le temps ne changera pas beaucoup, indépendamment de la façon dont de nombreux éléments sont dans le jeu. Les tableaux ont linéaire des opérations pour l'ensemble de ces, mais la baisse des frais généraux. Cela signifie que les tableaux seront généralement mieux pour les petits ensembles. J'ai fait quelques tests sur ma machine il n'ya pas longtemps avec un ArraySet mise en œuvre, et a trouvé qu'il était généralement mieux jusqu'à environ 150 éléments pour utiliser le Tableau, plutôt que de Hachage (mais ça dépend un peu sur la mise en œuvre et sur les opérations: l'Itération a été beaucoup plus rapide par exemple).Il y a des millions d'avis sur ce point., javacodegeeks.com/2010/08/... et ibm.com/developerworks/library/j-jtp02183
En fonction du nombre d'articles que vous avez EnumSet ou quelque chose comme ça pourrait être une option.
Jetez un oeil à stackoverflow.com/questions/10196343/...
OriginalL'auteur donnyton | 2013-09-09
Vous devez vous connecter pour publier un commentaire.
Dépend de vos données;
HashSet
vous donne unO(1)
méthode contains() mais n'a pas de préserver l'ordre.ArrayList
contient() estO(n)
mais vous pouvez contrôler l'ordre des entrées.Array
si vous avez besoin d'insérer quelque chose entre les deux, le pire des cas, peut être O(n), puisque vous devrez déplacer les données vers le bas et faire de la place pour l'insertion. DansSet
, vous pouvez utiliser directementSortedSet which too has O(n) too but with flexible operations.
Je crois, est plus souple.
TreeSet
(la mise en œuvre deSortedSet
) estlog(n)
insertion/recherche...Tx. A été mettant en évidence le point sur la flexibilité sur les Ensembles de Tableau.
OriginalL'auteur JNL
De logiciels d'Entreprise Évolutive et nettoyer le Code est beaucoup mieux. Donc, je vais, pour HashSet.
OriginalL'auteur auhuman
Le choix dépend grandement de ce que vous voulez faire avec elle.
Si c'est ce qui est mentionné dans votre question:
Si c'est ce que vous devez faire, vous n'avez ni besoin d'eux. Il y a une méthode size() dans Collection pour lesquels vous pouvez obtenir la taille de celui-ci, ce qui signifie combien d'entre eux y sont dans la collection.
Si ce que tu veux dire par "la collecte de l'objet" n'est pas vraiment une collection, et vous devez choisir un type de collection pour stocker vos objets pour la poursuite du traitement, puis vous avez besoin de savoir, pour différents types de collections, il y a différentes capacités et caractéristiques.
D'abord, je crois avoir une comparaison équitable, vous devriez envisager d'utiliser ArrayList au lieu de Tableau, pour lequel vous n'avez pas besoin de faire face à la réaffectation.
Puis il devenir le choix de ArrayList vs HashSet, ce qui est assez simple:
Avez-vous besoin d'une Liste ou d'un Ensemble? Ils sont dans un but différent: les Listes de vous fournir un accès indexé, et l'itération est dans l'ordre des index. Alors que les Jeux sont principalement pour vous de garder un ensemble distinct de données, et compte tenu de sa nature, vous n'aurez pas accès indexé.
Après avoir fait votre choix de la Liste ou un Ensemble de recours, alors, c'est un choix de la Liste/l'Ensemble de la mise en œuvre, normalement pour les Listes, vous choisissez à partir de ArrayList et LinkedList, tandis que pour les Jeux, à vous de choisir entre HashSet et TreeSet.
Tout le choix dépend de ce que vous voulez faire avec cette collection de données. Ils s'effectue différemment sur différentes actions.
Par exemple, un accès indexé dans la liste de tableaux est O(1), dans HashSet (mais non significatif) est O(n), (juste pour votre intérêt, dans LinkedList est O(n), dans TreeSet est O(nlogn) )
Pour l'ajout d'un nouvel élément, à la fois ArrayList et HashSet est O(1). L'insertion dans le milieu est O(n) pour ArrayList, alors qu'il ne fait pas de sens dans HashSet. Les deux vont souffrir de réaffectation, et les deux ont besoin de O(n) pour la réaffectation (HashSet est normalement plus lent dans la réallocation, parce que cela implique le calcul de hachage pour chaque élément).
À trouver si l'élément existe dans la collection, liste de tableaux est O(n) et HashSet est O(1).
Il y a toujours beaucoup d'activités que vous pouvez faire, de sorte qu'il est tout à fait dénué de sens de discuter de la performance sans savoir ce que vous voulez faire.
OriginalL'auteur Adrian Shum
en théorie, et comme SCJP6 guide d'Étude, déclare 😀
tableaux sont plus rapides que les collections, et comme l'a dit, la plupart des collections dépend principalement sur les tableaux (les Cartes ne sont pas considérés comme Collection, mais ils sont inclus dans les Collections cadre)
si vous garantie que la taille de vos éléments ne changeront pas, pourquoi coincé dans les Objets construits sur des Objets (Collections construit sur les Tableaux) alors que vous pouvez utiliser la racine directement les objets (tableaux)
Si suppose que j'ai besoin de stocker 5 constantes de chaîne et d'analyser les mêmes dans l'un de la boucle, je pense que les Tableaux sont de plus approprié par commentaire ci-dessus. S'il vous plaît laissez-moi savoir
OriginalL'auteur Ahmed Adel Ismail
Il semble que vous voulez une table de hachage que les cartes id de compte. En particulier,
De cette façon, vous obtenez amorti O(1) ajoute, les contient et les récupérations. Essentiellement, un tableau avec un id unique est associé à chaque objet EST une table de hachage. À l'aide de la table de hachage, vous obtenez l'avantage supplémentaire de ne pas avoir à gérer la taille de la matrice, de ne pas avoir à la carte les clés d'un tableau d'index vous-même ET de la constante de temps d'accès.
HashSet
, si les objets qu'il utilise ont unhashCode
méthode qui retourne un identifiant unique. Notez que cela change que très peu dans la pratique, depuisHashSet
utilise une instance deHashMap
en interne...OriginalL'auteur anguyen