Char Tableau vs String: ce qui est mieux pour le stockage d'un ensemble de lettres
J'ai besoin de stocker dans une constante de classe 4 lettre d'un code. Je peux le faire:
static final String CODE_LETTERS = "TRWAG";
ou
static final char[] CODE_LETTERS = {'T', 'R', 'W', 'A', 'G'};
Après, je peux en obtenir un de ces personnages de deux façons:
final char codeLetter = CODE_LETTERS.charAt(index);
ou
final char codeLetter = CODE_LETTERS[index];
quelle est la meilleure façon de faire?. Veuillez prendre dans l'esprit de la correction, de la performance, etc.
Ressemble de 5 lettres 🙂
OriginalL'auteur xgomez | 2009-04-29
Vous devez vous connecter pour publier un commentaire.
La Performance n'est pas pertinent dans ce cas. Si c'est vraiment censé être constante, vous ne pouvez pas utiliser la
char[]
approche. Considérer:Je voulais dire qu'il n'est pas une question de performance, parce que le char[] version ne fonctionne même pas comme prévu. Concentrons-nous sur la correction des erreurs manifestes DANS CE CAS: optimisation prématurée, et à l'aide d'un tableau comme une constante.
J'ai édité ma réponse après l'échange ci-dessus et ajouté le "dans ce cas" qualificatif. Je suis le mentionner ici, pour éviter toute confusion des lecteurs trop mal.
OriginalL'auteur Alan Moore
Ni est incorrect, mais puisque vous allez avoir affaire avec la
char
s individuellement, je serais personnellement utiliser lechar []
. Cela dit, l'impact que cela va avoir sur la performance va être négligeable, même si les mesurable.OriginalL'auteur Eoin Campbell
Sauf si vous allez chercher le caractère de plusieurs millions de fois dans une rangée, vous n'avez pas besoin de vous soucier de la performance.
Mais aussi il ne faut pas pessimize prématurément. Pour une longueur fixe, immuable chaîne en un tableau de char sera toujours plus vite et ont moins de surcharge de la mémoire de la equiavlent std::string objet.
Il pourrait bien être le genre de chose qui se fait beaucoup de fois. Si c'était une nouvelle méthode dans la mise en œuvre de
java.lang.String
?OriginalL'auteur Fredrik Mörk
Ce n'est presque certainement une optimisation prématurée. Tout ce que vous enregistrez dans la performance à l'aide d'un tableau de caractères peut être perdu en lisibilité si vous avez besoin de les donner à d'autres méthodes, comme il est plus canonique à accepter un
String
plutôt qu'unchar[]
.OriginalL'auteur John Feminella
Les chaînes sont immuables, char[] ne l'est pas. Si vous êtes à la définissant comme un public "constante" dans une classe, puis de la Chaîne est le réel constant.
Par exemple, si vous avez ceci:
J'ai peut être sournois et cela:
Bam, j'ai changé la valeur de votre "constante".
La
final
mot-clé n'affecte que la référence à la matrice, il ne s'applique pas aux éléments du tableau. Je vois une telle erreur tout le temps avecCollections.unmodifiableList()
, les gens pensent que la protection de leur liste, mais le code client peut toujours accéder et modifier les éléments de la liste.Donc, pour répondre à votre question, utilisez la Chaîne.
OriginalL'auteur Mike Kucera
Le sens de
String
ne correspondent vraiment à un ensemble dechar
. Doncchar[]
comme une mise en œuvre, bien que pas sens, ne serait pas ajouter un petit sens de l'String
. Otoh, que, vous pourriez trouver utile de la méthode dansString
. Sur la troisième main, java.util.Les tableaux a aussi des méthodes utiles tels que [binarySearch][2].Peut-être ce que vous voulez faire est de présenter une abstraction d'un ensemble de
char
qui peut varier de mise en œuvre entre l'utilisation deString
le moyen le plus simple qui pourrait éventuellement travailler, linéaire de la numérisation d'unchar[]
(rapide si vous ne contrôler pas très loin), la recherche binaire, bit. éparses ensemble de bits, hachés, inondation filtrée, etc.[2]: http://java.sun.com/javase/6/docs/api/java/util/Arrays.html#binarySearch(char%5B%5D, int, int, char)
OriginalL'auteur Tom Hawtin - tackline
Depuis une Chaîne de caractères utilise un char[] pour tenir vos lettres, la vraie réponse est le char[] est plus rapide. En cas de doute, regardez le code source, il y a pas de magie dans la Chaîne, il utilise juste primitives comme int et char[] juste comme n'importe quelle autre classe.
Vous vraiment ne devrais pas soucient de quelque chose d'aussi trivial que cela. Un enfer de beaucoup plus qui se passe à l'intérieur d'un programme, que s'inquiéter de savoir si une Chaîne est plus rapide que d'utiliser un tableau de char.
OriginalL'auteur mP.
La seule fois que vous verrez une différence de performance entre la Chaîne et le tableau de caractères va être sous un profileur, et alors seulement parce que le profileur faire la mauvaise chose. Moderne machines virtuelles java (JDk 6+) va générer le même code pour les deux accès une fois la JVM décide que c'est assez chaud pour optimiser.
Pour répondre à votre question, Si vous utilisez Java 5, utiliser les énumérations, si vous utilisez quelque chose avant de Java5, utilisez le Java énumération Modèle.
Il permet de rendre votre code plus lisible, que vous n'aurez pas besoin de garder une trace de la décalages quelque part, vous pouvez simplement utiliser l'énumération. En outre, il sera être plus rapide, car vous serez en mesure de faire quelque chose comme:
Si les valeurs enum sont T, R, W, A, G puis toString() pourrait être utilisée.
OriginalL'auteur Paul Wagland
Ressemble à envisager l'utilisation d'un enum.
Voir Les Types Enum
OriginalL'auteur crowne
Drôle, j'ai justement écrit un l'entrée de blog sur ce hier. Vous avez besoin d'une classe spécialisée enroulé autour du char[]. Mon Caractères de classe est un moyen léger de garder un immuable ensemble de caractères, et très efficace des méthodes pour des choses comme la recherche. Il est open source.
merci pour les belles paroles. J'ai ajouté Facebook "comme" la capacité de mon site de blog, donc n'hésitez pas à essayer ça! 😉
OriginalL'auteur Garret Wilson