Tableau ou une Liste en Java. Ce qui est plus rapide?
J'ai garder des milliers de chaînes de caractères dans la mémoire accessible en série en Java. Dois-je stocker dans un tableau ou dois-je utiliser une sorte de Liste ?
Depuis les tableaux de conserver toutes les données dans un espace contigu de mémoire (à la différence des Listes), l'utilisation d'un tableau pour stocker des milliers de chaînes de causer des problèmes ?
- "Depuis les tableaux de conserver toutes les données dans un espace contigu de mémoire" avez-vous une sorte de citation pour pour Java?
- Pas de matt. Je le sais pour C. je suppose que Java serait d'utiliser la même méthode.
- Je doute qu'il serait de les garder dans une seule partie de la mémoire.
- Même si c'est un seul bloc de mémoire, il avait toujours autour de 1000 * 4 = 4 ko vaut la peine, ce qui n'est pas beaucoup de mémoire.
- Est-ce un cas de l'optimisation prématurée? La bonne réponse est "Ça dépend". Cela dépend de la JVM en cours d'exécution, il dépend de la façon dont votre compilateur JIT est l'optimisation du code, cela dépend de la plate-forme que vous utilisez. Les tableaux peuvent être plus rapides dans le JET ou Aviaire , mais la liste pourrait être plus rapide sur HotSpot ou IcedTea. En bref, si c'est le degré de contrôle que vous avez besoin de plus de performances, vous devez utiliser un niveau beaucoup plus faible de la langue comme de l'assemblée ou C. Java n'est pas adapté.
- La question (dans les commentaires au sujet de la mémoire) ne peut pas être répondu parce que la Liste est une interface non de mise en œuvre. Liste de tableaux vous permettra de toujours garder les données dans un bloc contigu de mémoire (il stocke un tableau, d'où le nom). D'autres implémentations de faire d'autres choses.
- C'est ce que 'array' signifie tout au long de CS. Pas de citation nécessaire. Les nombreuses références dans le JLS> et [JVM Spec]() à la matrice des longueurs ne sont compréhensibles que si les tableaux sont contigus.
- Ils ne sont sûrement pas stockées en continu de la partie de la mémoire. Objet Java variables sont des pointeurs sur des objets réels (sauf s'ils sont locaux et de les mettre sur la pile par la JVM), de sorte que le tableau de Chaîne est, en fait, un tableau de pointeurs vers des objets de Chaîne qui peut être placé n'importe où dans le tas.
- veuillez retirer votre mauvaise modifier. Vous n'avez pas de réponse ou la réponse à une question
InformationsquelleAutor euphoria83 | 2009-04-04
Vous devez vous connecter pour publier un commentaire.
Je vous suggère d'utiliser un profiler pour tester ce qui est plus rapide.
Mon opinion personnelle est que vous devez utiliser des Listes.
Je travaille sur une grande base de code et un groupe de développeurs ont utilisé des tableaux partout. Il fait le code très rigides. Après la modification de gros morceaux de Listes, nous avons remarqué aucune différence dans la vitesse.
La Java façon est que vous devriez considérer ce que les données abstraction le plus adapté à vos besoins. Rappelez-vous qu'en Java, une Liste est un résumé, pas un type concret. Vous devez déclarer les cordes comme une Liste, puis l'initialiser à l'aide de la liste de tableaux mise en œuvre.
Cette séparation de Type Abstrait de Données et de mise en œuvre spécifiques est l'un des principaux aspects de la programmation orientée objet.
Une liste de tableaux met en œuvre la Liste Type Abstrait de Données à l'aide d'un tableau comme son implémentation sous-jacente. La vitesse d'accès est pratiquement identique à un tableau, avec les avantages supplémentaires d'être en mesure d'ajouter et de soustraire des éléments d'une Liste (bien que ce soit un O(n) opérations avec une liste de tableaux), et que si vous décidez de changer l'implémentation sous-jacente plus tard, vous pouvez. Par exemple, si vous réalisez que vous avez besoin accès synchronisé, vous pouvez changer la mise en œuvre d'un Vecteur sans avoir à réécrire tout le code.
En fait, la liste de tableaux a été spécifiquement conçu pour remplacer le faible niveau de la matrice de construire dans la plupart des contextes. Si Java a été conçu aujourd'hui, il est tout à fait possible que des tableaux ont été laissés de côté complètement en faveur de la liste de tableaux de construire.
En Java, toutes les collections de stocker uniquement les références à des objets, et non les objets eux-mêmes. Les deux tableaux et ArrayList va stocker quelques milliers de références dans une ligne de tableau, de sorte qu'ils sont essentiellement identiques. Vous pouvez considérer qu'un bloc contigu de quelques milliers de 32 bits références seront toujours facilement disponibles sur le matériel moderne. Cela ne garantit pas que vous ne manquerez pas de mémoire tout à fait, bien sûr, c'est juste que le bloc contigu de mémoire exigence n'est pas difficile à accomplir.
Vous devriez préférer les types génériques sur des tableaux. Comme mentionné par d'autres, les tableaux sont rigides et n'ont pas le pouvoir expressif des types génériques. (Il y a toutefois un support d'exécution typage, mais qui se mélange mal avec les types génériques.)
Mais, comme toujours, lors de l'optimisation, vous devez toujours suivre ces étapes:
Bien que les réponses qui propose d'utiliser ArrayList n'a de sens que dans la plupart scénario, la question réelle de la performance relative n'a pas vraiment eu de réponse.
Il ya quelques choses que vous pouvez faire avec un tableau:
Conclusion générale
Bien que les opérations get et set sont un peu plus lent sur une liste de tableaux (resp. 1 et 3, l'ordre de la nanoseconde par appel sur ma machine), il y a très peu de frais généraux de l'utilisation d'une liste de tableaux vs un tableau pour tout usage non intensif. Il y a cependant quelques petites choses à garder à l'esprit:
list.add(...)
) sont coûteux et que l'on devrait essayer de définir la capacité initiale à un niveau adéquat lorsque c'est possible (à noter que le même problème se pose lors de l'utilisation d'un tableau)Résultats détaillés
Voici les résultats que j'ai mesuré pour ces trois opérations à l'aide de la jmh l'analyse comparative de la bibliothèque fois (en nanosecondes) avec JDK 7 sur un x86 standard machine de bureau. Notez que la liste de tableaux ne sont jamais redimensionnées dans les tests afin de vérifier que les résultats sont comparables. Référence code disponible ici.
Tableau/Liste De Tableaux Création
J'ai couru 4 tests, l'exécution des instructions suivantes:
Integer[] array = new Integer[1];
List<Integer> list = new ArrayList<> (1);
Integer[] array = new Integer[10000];
List<Integer> list = new ArrayList<> (10000);
Résultats (en nanosecondes par appel, de confiance à 95%):
Conclusion: aucune différence notable.
de lancer des opérations
J'ai couru 2 tests, l'exécution des instructions suivantes:
return list.get(0);
return array[0];
Résultats (en nanosecondes par appel, de confiance à 95%):
Conclusion: arriver à partir d'un tableau est d'environ 25% plus rapide que d'obtenir à partir d'une liste de tableaux, bien que la différence n'est que de l'ordre de l'ordre de la nanoseconde.
ensemble des opérations
J'ai couru 2 tests, l'exécution des instructions suivantes:
list.set(0, value);
array[0] = value;
Résultats (en nanosecondes par appel):
Conclusion: définir les opérations sur les tableaux sont environ 40% plus rapide que sur les listes, mais que, pour l'obtenir, chaque ensemble de l'opération ne prend que quelques nanosecondes - donc pour la différence pour atteindre 1 seconde, il serait nécessaire de définir les éléments de la liste/tableau des centaines de millions de fois!
clone/copie
ArrayList du constructeur de copie délégués à
Arrays.copyOf
afin que les performances sont identiques à la gamme de copier (copie d'un tableau viaclone
,Arrays.copyOf
ouSystem.arrayCopy
fait pas de différence en terme de performance).J'imagine que l'affiche originale est à venir à partir d'un C++/STL en arrière-plan qui est à l'origine d'une certaine confusion. En C++
std::list
est une liste doublement chaînée.En Java
[java.util.]List
est une implémentation libre de l'interface (abstraite pure classe en C++ termes).List
peut être une liste doublement chaînée -java.util.LinkedList
est fourni. Cependant, 99 fois sur 100 quand vous voulez faire une nouvelleList
, vous souhaitez utiliserjava.util.ArrayList
au lieu de cela, ce qui est l'équivalent de C++std::vector
. Il existe d'autres implémentations standard, telles que celles retournées parjava.util.Collections.emptyList()
etjava.util.Arrays.asList()
.À partir d'un point de vue des performances, il est un petit coup de passer par l'intermédiaire d'une interface et d'un objet supplémentaire, cependant runtime inline signifie rarement a aucune importance. Rappelez-vous aussi que
String
sont généralement l'objet de plus de tableau. Donc, pour chaque entrée, vous avez probablement deux autres objets. En C++std::vector<std::string>
, bien que la copie par valeur sans un pointeur en tant que tel, les tableaux de caractères forment un objet en chaîne de caractères (et elles ne seront pas généralement être partagé).Si ce code est vraiment la performance sensible, vous pouvez créer une seule
char[]
tableau (ou mêmebyte[]
) pour tous les caractères de toutes les chaînes, et ensuite un tableau des décalages. Autant que je me souvienne, c'est comment javac est mis en œuvre.Je suis d'accord que dans la plupart des cas, vous devez choisir la souplesse et l'élégance de ArrayLists sur des tableaux - et dans la plupart des cas, l'impact sur le rendement du programme sera négligeable.
Toutefois, si vous êtes constants, lourd itération avec peu de changements structurels (pas ajoute et supprime) pour, par exemple, le logiciel de rendu des graphiques ou une machine virtuelle personnalisée, mon accès séquentiel analyse comparative des tests montrent que ArrayLists sont de 1,5 x plus lent que les tableaux sur mon système (Java 1.6 sur mon année-vieux iMac).
Code:
Bien tout d'abord, il vaut la peine de clarifier voulez-vous dire par "liste" dans le classique comp sci les structures de données de sens (c'est à dire une liste liée) ou voulez-vous dire java.util.Liste? Si vous entendez un java.util.Liste, c'est une interface. Si vous souhaitez utiliser un tableau suffit d'utiliser la liste de tableaux mise en œuvre et vous obtiendrez le tableau du comportement et de la sémantique. Le problème est résolu.
Si tu veux un tableau vs une liste chaînée, c'est un peu différente argument pour lequel nous allons revenir à la Big O (ici, est un plaine explication anglais si c'est un inconnu terme.
Tableau;
Liste Chaînée:
Vous pouvez ainsi choisir celui qui convient le mieux à la façon dont vous redimensionnez votre tableau. Si vous redimensionnez, insérer et supprimer beaucoup, alors peut-être une liste chaînée est un meilleur choix. En va de même pour les cas d'accès aléatoire est rare. Vous mentionnez accès série. Si vous êtes essentiellement faire des accès série avec très peu de modifications, alors il n'a probablement pas d'importance qui vous choisissez.
Les listes chaînées sont légèrement plus généraux, puisque, comme vous le dites, vous êtes en relation avec potentiellement non-blocs de mémoire contigus et (de fait) des pointeurs vers l'élément suivant. Ce n'est probablement pas un facteur important, sauf si vous avez affaire à des millions d'entrées cependant.
J'ai écrit un petit benchmark pour comparer ArrayLists avec des Tableaux. Sur mon vieux-ish ordinateur portable, le temps de parcourir à travers un 5000-élément arraylist, 1000 fois, était d'environ 10 millisecondes plus lent que l'équivalent de la matrice de code.
Ainsi, si vous voulez ne rien faire, mais en itérant la liste, et que vous êtes en train de faire beaucoup, alors peut-être il vaut la peine de l'optimisation. Sinon, je voudrais utiliser la Liste, car il sera plus facile lorsque vous ne nécessité d'optimiser le code.
n.b. Je ne avis que l'utilisation de
for String s: stringsList
était d'environ 50% plus lent que d'utiliser un vieux style de boucle pour accéder à la liste. Allez comprendre... Voici les deux fonctions, j'ai chronométré; le tableau et de liste ont été remplis avec 5000 aléatoire (différent) les chaînes de caractères.char[]
n'est pas touché (ce n'est pas C).Non, parce que techniquement, le tableau ne stocke que la référence à la les chaînes. Les cordes sont eux-mêmes affectés dans un emplacement différent. Pour un millier d'articles, je dirais une liste qui serait mieux, c'est plus lent, mais il offre plus de flexibilité et il est plus facile à utiliser, surtout si vous allez à les redimensionner.
Si vous avez des milliers, pensez à utiliser un trie. Un trie est une structure en forme d'arbre qui fusionne la commune de préfixes de la chaîne stockée.
Par exemple, si les chaînes sont
La trie de stocker:
Les cordes nécessite 57 caractères (y compris le terminateur null, '\0') pour le stockage, ainsi que la taille de la Chaîne de l'objet qui les contient. (En vérité, nous devrions probablement le tour de toutes les tailles jusqu'à des multiples de 16, mais...) Appeler 57 + 5 = 62 octets, à peu près.
La trie exige 29 (y compris le terminateur null, '\0') pour le stockage, ainsi que sizeof la trie les nœuds, qui sont une référence à un tableau et une liste de enfant trie les nœuds.
Pour cet exemple, qui vient probablement les mêmes, par milliers, il est probablement moins aussi longtemps que vous avez en commun des préfixes.
Maintenant, lors de l'utilisation de la trie dans un autre code, vous devrez le convertir en String, probablement à l'aide d'un StringBuffer comme un intermédiaire. Si la plupart des chaînes sont en cours d'utilisation à la fois comme des Chaînes de caractères, à l'extérieur de la trie, c'est une perte.
Mais si vous êtes seulement en utilisant un peu à l'époque -- dire, de regarder les choses dans un dictionnaire -- la trie peut vous faire économiser beaucoup d'espace. Certainement moins d'espace que de les ranger dans un HashSet.
Vous dites que vous êtes d'accéder "en série" -- si cela signifie de manière séquentielle un ordre alphabétique, la trie aussi évidemment vous donne l'ordre alphabétique pour gratuit, si vous parcourir en profondeur d'abord.
Mise à JOUR:
Comme Mark l'a noté il n'y a pas de différence significative après JVM warm up (plusieurs passes de test). Vérifié avec re-créé un tableau ou même nouveau départ avec une nouvelle ligne de la matrice. Avec une grande probabilité, cela signe simple tableau avec un indice d'accès ne doit pas être utilisé en faveur de collections.
Encore 1-2 premières passes tableau simple est de 2 à 3 fois plus rapide.
ORIGINAL POST:
Trop de mots pour le sujet, trop simple à vérifier. Sans aucune question tableau est plusieurs fois plus rapide que n'importe quelle classe conteneur. Je tourne sur cette question à la recherche d'alternatives pour ma performance en section critique. Voici le prototype de code que j'ai construit pour vérifier la situation réelle:
Et voici la réponse:
Basé sur le tableau (ligne 16 est active):
Basée sur la liste (ligne 17 est active):
Plus de commentaire sur "plus rapidement"? C'est tout à fait compris. La question est de savoir quand à peu près 3 fois plus rapide est mieux pour vous que la flexibilité de la Liste. Mais c'est une autre question.
Par la façon dont j'ai vérifié ce trop basés sur les construits manuellement
ArrayList
. Presque le même résultat.3
fois plus rapide que la vraie, mais d'une manière insignifiante, donc.14ms
n'est pas un long tempsPuisqu'il y a déjà beaucoup de bonnes réponses ici, je voudrais vous donner quelques informations de vue pratique, ce qui est insertion d'itération et de comparaison des performances : primitive tableau vs liste Liée dans Java.
Ce qui est réel simple contrôle de performance.
Alors, le résultat dépendra de la performance de la machine.
Code Source utilisé pour cela est ci-dessous :
Résultat est ci-dessous :
Rappelez-vous que une liste de tableaux encapsule un tableau, il y a peu de différence par rapport à l'utilisation d'une primitive de tableau (à l'exception du fait que la Liste est beaucoup plus facile de travailler avec java).
La assez bien le seul moment où il est logique de préférer un tableau à une ArrayList est lorsque vous stockez des primitives, c'est à dire byte, int, etc et vous avez besoin de l'espace particulier-efficacité que vous obtenez en utilisant primitive tableaux.
Tableau vs Liste de choix n'est pas si important (compte tenu de la performance) dans le cas de stockage d'objets string. Parce que les deux tableau et de liste va stocker la chaîne des références à des objets, pas des objets réels.
Si vous savez à l'avance la taille des données est alors un tableau sera plus rapide.
Une Liste est plus souple. Vous pouvez utiliser une ArrayList qui est soutenu par un tableau.
liste est plus lent que les tableaux.Si vous avez besoin de l'efficacité de l'utilisation des tableaux.Si vous avez besoin de flexibilité d'utilisation de la liste de.
Vous pouvez vivre avec une taille fixe, les tableaux seront plus vite et ont besoin de moins de mémoire.
Si vous avez besoin de la flexibilité de la Liste de l'interface avec l'ajout et la suppression d'éléments, la question demeure de mise en œuvre qui devrait vous choisir. Souvent ArrayList est recommandé et utilisé pour tous les cas, mais aussi ArrayList a ses problèmes de performance si les éléments au début ou au milieu de la liste doit être retirée ou insérée.
Par conséquent, vous voudrez peut-être avoir un coup d'oeil à http://java.dzone.com/articles/gaplist-%E2%80%93-lightning-fast-list qui introduit GapList. Cette nouvelle liste mise en œuvre combine les forces des deux ArrayList et LinkedList résultant dans de très bonnes performances pour presque toutes les opérations.
En fonction de la mise en œuvre. il est possible qu'un tableau de types primitifs sera plus petit et plus efficace que la liste de tableaux. C'est parce que le tableau va stocker les valeurs directement dans un bloc contigu de mémoire, alors que le plus simple liste de tableaux mise en œuvre permettra de stocker des pointeurs vers chaque valeur. Sur une plate-forme 64 bits en particulier, cela peut faire une énorme différence.
Bien sûr, il est possible pour la jvm d'avoir un cas particulier de cette situation, auquel cas le rendement sera le même.
Liste est la voie privilégiée dans java 1.5 et au-delà, car il peut utiliser des génériques. Les tableaux ne peuvent pas avoir des médicaments génériques. Aussi les Tableaux ont un pré-définies de longueur, ce qui ne peut pas se développer de manière dynamique. L'initialisation d'un tableau avec une grande taille n'est pas une bonne idée.
ArrayList est la façon de déclarer un tableau avec les médicaments génériques, et il peut développer dynamiquement.
Mais si la suppression et l'insertion est utilisé plus fréquemment, puis liste chaînée est le plus rapide de la structure de données pour être utilisés.
Tableaux recommandé partout où l'on peut utiliser au lieu de la liste, en particulier dans le cas où si vous connaissez des éléments de comte et de la taille ne serait pas en train de changer.
Voir Oracle Java meilleures pratiques: http://docs.oracle.com/cd/A97688_16/generic.903/bp/java.htm#1007056
Bien sûr, si vous avez besoin d'ajouter et de supprimer des objets de collection, de nombreuses fois facile d'utiliser des listes.
Aucune des réponses a des informations que j'ai été intéressé par répétitives scan de la même matrice de beaucoup de beaucoup de fois. Dû créer un JMH test pour cela.
Résultats (Java 1.8.0_66 x32, l'itération simple tableau est au moins 5 fois plus rapide que ArrayList):
Test
Des"milliers" n'est pas un grand nombre. Quelques milliers de paragraphe chaînes de longueur sont de l'ordre de quelques mo en taille. Si tout ce que vous voulez faire est d'accéder à ces alternativement, utilisez immuable Liste liée individuellement.
Je suis venu ici pour obtenir un meilleur sentiment de l'impact sur les performances de l'utilisation de listes des tableaux. J'ai dû adapter le code ici pour mon scénario: tableau/liste de ~1000 entiers à l'aide de la plupart des getters, sens de tableau[j] vs. liste.get(j)
En prenant le meilleur de 7 à être non-scientifique à ce sujet (quelques avec la liste des endroits où 2.5 x plus lent), j'obtiens ceci:
- donc, très approximativement 30% plus rapide avec le tableau
La deuxième raison pour poster maintenant, c'est que personne ne mentionne l'impact si vous n'math/matrix/simulation/optimisation de code avec imbriquée boucles.
Dire que vous avez trois niveaux imbriqués et la boucle interne est deux fois plus lent que vous cherchez à 8 fois plus de performances. Quelque chose qui irait dans un jour prend maintenant une semaine.
*MODIFIER
Très choqué, ici, pour le plaisir j'ai essayé de déclarer int[1000] plutôt que Integer[1000]
À l'aide Integer[] vs int[] représente un double de performances, ListArray avec itérateur est 3x plus lent que int[]. Vraiment la pensée de Java liste des implémentations autochtones étaient semblables à des tableaux...
Code de référence (appeler plusieurs fois):
Ne pas entrer dans le piège de l'optimisation sans une analyse comparative. Comme d'autres l'ont suggéré d'utiliser un profiler avant de faire une quelconque hypothèse.
Les différentes structures de données que vous avez énumérés ont des finalités différentes. Une liste est très efficace lors de l'insertion d'éléments au début et à la fin, mais souffre beaucoup lors de l'accès aux éléments aléatoires. Une matrice de stockage fixe, mais fournit à accès aléatoire rapide. Enfin une liste de tableaux améliore l'interface d'un tableau en lui permettant de grandir. Normalement, la structure de données doit être dicté par la façon dont les données stockées seront de l'accès ou de l'ajout.
Sur la consommation de mémoire. Vous semblez être un mélange de certaines choses. Un tableau ne vous donnent toujours une partie de la mémoire pour le type de données que vous avez. N'oubliez pas que java a un fixe de types de données: boolean, char, int, long, float et de l'Objet (ceci inclut tous les objets, même un tableau est un Objet). Cela signifie que si vous déclarez un tableau de Chaîne de caractères les chaînes de [1000] ou MyObject myObjects [1000] vous obtenez seulement un 1000 boîtes à souvenirs assez grand pour stocker l'emplacement (références ou des pointeurs) des objets. Vous n'avez pas de 1000 boîtes à souvenirs assez grand pour s'adapter à la taille des objets. N'oubliez pas que vos objets sont d'abord créé avec la "nouvelle". C'est lors de l'allocation de mémoire est fait et, plus tard, une référence (leur adresse mémoire) est stocké dans le tableau. L'objet n'est pas d'avoir copié dans le tableau que c'est la référence.
Je ne pense pas que cela fait une réelle différence pour les Chaînes de caractères. Ce qui est contiguë dans un tableau de chaînes est les références à la de chaînes, les chaînes sont stockées à des endroits aléatoires dans la mémoire.
Tableaux par rapport aux Listes peuvent faire une différence pour les types primitifs, pas pour les objets. SI vous savez à l'avance le nombre d'éléments, et n'ont pas besoin de la flexibilité, un tableau de millions d'entiers ou en double seront plus efficaces dans la mémoire et légèrement à la vitesse de la liste, parce qu'en effet ils seront stockés de manière contiguë et accessible instantanément. C'est pourquoi Java utilise encore des tableaux de caractères pour les chaînes de caractères, des tableaux d'entiers pour les données d'image, etc.
Tableau est plus rapide - mémoire pré-alloué à l'avance.
Beaucoup de microbenchmarks donnés ici ont trouvé les numéros de quelques nanosecondes pour des choses comme le tableau/liste de tableaux lit. C'est tout à fait raisonnable si tout est dans votre cache L1.
Un niveau plus élevé de cache ou mémoire principale d'accès peut avoir l'ordre de grandeur des temps de quelque chose comme 10nS-100 ns, vs plus comme 1nS pour le cache L1. Accéder à une liste de tableaux a une mémoire supplémentaire d'indirection, et dans une application réelle, vous pourriez le payer quelque chose de presque jamais de tous les temps, selon ce que votre code est fait entre les accès. Et, bien sûr, si vous avez beaucoup de petits ArrayLists cela peut ajouter à votre utilisation de la mémoire et de la rendre plus probable que vous aurez les défauts de cache.
L'original de l'affiche semble être en utilisant simplement l'un et l'accès à beaucoup de contenu dans un court laps de temps, il devrait donc y avoir de grandes difficultés. Mais c'est peut être différent pour d'autres personnes, et vous devriez faire attention lors de l'interprétation de microbenchmarks.
Cordes de Java, cependant, sont terriblement inutile, surtout si vous stockez beaucoup de petits (il suffit de les regarder avec une mémoire de l'analyseur, il semble > 60 octets pour une chaîne de quelques caractères). Un tableau de chaînes de caractères a une indirection vers l'objet de type String, et l'autre de la Chaîne de l'objet de type char[] qui contient la chaîne elle-même. Si quelque chose va souffler votre cache L1 c'est ceci, combiné avec des milliers ou des dizaines de milliers de Chaînes de caractères. Donc, si vous êtes sérieux vraiment sérieux au sujet de raclage des performances aussi élevées que possible, alors vous pourriez regarder de le faire différemment. Vous pourriez dire, maintenir les deux tableaux, un char[] avec toutes les chaînes, l'un après l'autre, et un int[] avec des compensations pour les départs. Ce sera un pain PITA à faire n'importe quoi avec, et vous avez presque certainement n'avez pas besoin. Et si vous le faites, vous avez choisi la mauvaise langue.
Il dépend de la façon dont vous avez accès.
Après le stockage, si vous principalement souhaitez faire les recherches, avec peu ou pas d'insérer/supprimer, puis aller pour Array (comme la recherche se fait en O(1) dans les tableaux, tandis que d'ajouter/supprimer peuvent avoir besoin de re-ordonnancement des éléments).
Après le stockage, si votre objectif principal est d'ajouter/supprimer des chaînes, avec peu ou pas de recherche, de l'exploitation, puis aller pour la Liste.
Tableau est plus rapide que la Matrice de parce que ArrayList utiliser à l'interne de la matrice. si l'on peut directement ajouter des éléments dans le Tableau et indirectement ajouter un élément dans
Matrice de ArrayList toujours directement mécanisme est plus rapide que de manière indirecte mécanisme.
Il y a deux surchargé la méthode add() de méthodes dans la classe ArrayList:
1.
add(Object)
: ajoute un objet à la fin de la liste.2.
add(int index , Object )
: insère l'objet spécifié à la position spécifiée dans la liste.Comment la taille de la liste de tableaux se développe de façon dynamique?
Point Important à noter à partir de code ci-dessus est que nous sommes vérifier la capacité de l'ArrayList , avant l'ajout de l'élément. ensureCapacity() détermine quelle est la taille actuelle de occupé éléments et quelle est la taille maximale de la matrice. Si la taille de la remplir éléments (y compris le nouvel élément à ajouter à la classe ArrayList) est supérieure à la taille maximale de la matrice puis augmenter la taille de la matrice. Mais la taille du tableau ne peut pas être augmenté de façon dynamique. Donc ce qui se passe à l'interne qui est nouveau Tableau est créé avec la capacité
Jusqu'À La Version 6 De Java
(Mise À Jour) À Partir De Java 7
aussi, les données de l'ancien tableau est copié dans le nouveau tableau.
Avoir la surcharge de méthodes dans la liste de tableaux c'est pourquoi le Tableau est plus rapide que
ArrayList
.Tableaux, Elle serait toujours mieux quand nous avons à accélérer la récupération des résultats
Listes - Effectue les résultats en matière d'insertion et de suppression, car ils peuvent être fait en O(1), et fournit également des méthodes pour ajouter, extraire et de suppression des données facilement. Beaucoup plus facile à utiliser.
Mais rappelez-vous toujours que la récupération de données rapide lorsque la position d'index dans le tableau où sont stockées les données - est connu.
Cet objectif pourrait être atteint par le tri du tableau. Donc, cela augmente le temps de récupérer les données (c'est à dire; le stockage de données + tri des données + de rechercher la position où les données n'est). Donc cela augmente le temps d'attente supplémentaire pour extraire les données de la matrice de même ils peuvent être bons à récupérer les données plus rapidement.
Donc ce pourrait être résolu avec trie structure de données ou ternaire structure de données. Comme discuté ci-dessus la trie les données de la structure pourrait être très efficace dans la recherche des données de la recherche d'un en particulier, word peut être fait en O(1) de l'ampleur. Lorsque le temps est important à savoir si vous devez rechercher et de récupérer rapidement des données vous pouvez aller avec trie de la structure de données.
Si vous voulez que votre espace de mémoire pour être consommé moins et vous souhaitez avoir une meilleure performance puis aller avec ternaire structure de données. Ces deux sont adaptés pour stocker grand nombre de chaînes de caractères (par exemple; comme les mots figurant dans le dictionnaire).
Une Liste est plus souple.... il est donc préférable de Liste de tableau