2009-04-29 4 views
7

Je dois stocker dans une lettre de classe constante 4 d'un code. Je peux le faire:Char Array vs String: ce qui est mieux pour stocker un ensemble de lettres

static final String CODE_LETTERS = "TRWAG"; 

ou

static final char[] CODE_LETTERS = {'T', 'R', 'W', 'A', 'G'}; 

Après, je peux obtenir un des que les caractères de deux manières:

final char codeLetter = CODE_LETTERS.charAt(index); 

ou

final char codeLetter = CODE_LETTERS[index]; 

quelle est la meilleur moyen?. Veuillez prendre en compte la correction, la performance, etc.

+9

Ressemble 5 lettres :) – willcodejavaforfood

Répondre

6

Les performances ne sont pas pertinentes dans ce cas. Si c'est vraiment supposé être constant, vous ne pouvez pas utiliser l'approche char[]. Considérez:

public class Test 
{ 
    static final char[] CODE_LETTERS = {'T', 'R', 'W', 'A', 'G'}; 

    public static void main(String[] args) throws Exception 
    { 
    System.out.println(CODE_LETTERS[0]); // T 
    CODE_LETTERS[0] = 'x'; 
    System.out.println(CODE_LETTERS[0]); // x 
    } 
} 
+1

Qui a dit que la performance n'était pas pertinente? Beaucoup de gens consacrent beaucoup d'efforts à la performance. Bien sûr, la mise en œuvre peut faire des choses méchantes, mais si la représentation est localisée, nous pouvons simplement dire «ne fais pas ça». –

+1

Je voulais dire que ce n'est pas une question de performance, car la version de char [] ne fonctionne même pas comme prévu. Concentrons-nous sur la correction des erreurs évidentes DANS CE CAS: optimisation prématurée, et utilisation d'un tableau comme constante. –

+0

J'ai édité ma réponse après l'échange ci-dessus et ajouté le qualificatif "dans ce cas". Je le mentionne ici pour éviter de trop déranger les lecteurs. –

6

À moins que vous n'alliez chercher le personnage plusieurs millions de fois de suite, vous n'avez pas besoin de vous préoccuper de la performance.

+7

Mes pensées exactement. Sérieusement: * L'optimisation prématurée est la racine de tous les maux. * – pyrocumulus

+0

Mais il ne faut pas non plus pessimiser prématurément. Pour une chaîne immuable de longueur fixe, un tableau char sera toujours plus rapide et aura moins de mémoire que l'objet std :: string equiavlent. – PaulJWilliams

+0

C'est peut-être le genre de chose qui se fait beaucoup de fois. Et si c'était une nouvelle méthode dans l'implémentation de 'java.lang.String'? –

8

Ni l'un ni l'autre n'est incorrect, mais étant donné que vous allez traiter les char individuellement, j'utiliserais personnellement le char []. Cela dit, l'impact que cela aura sur la performance sera négligeable, voire mesurable.

5

Il s'agit presque certainement d'une optimisation prématurée. Tout ce que vous économisez en performance en utilisant un tableau de caractères peut être perdu en lisibilité si vous devez le donner à d'autres méthodes, car il est plus canonique d'accepter un String plutôt qu'un char[].

1

Puisqu'un String utilise un caractère [] pour contenir vos lettres, la vraie réponse est le caractère [] est plus rapide. En cas de doute, regardez la source, il n'y a pas de magie dans String, il utilise juste des primitives comme int et char [] comme n'importe quelle autre classe.

Vous ne devriez vraiment pas vous soucier de quelque chose d'aussi trivial que cela. Beaucoup plus de choses se passent au sein d'un programme, qui se soucient de savoir si une seule chaîne est plus rapide que d'utiliser un tableau char.

+0

Oui, mais lorsqu'une chaîne est sémantiquement destinée à être utilisée comme une chaîne au lieu d'un tableau de caractères, alors String doit être utilisé. L'utilisation de char [] dans Java n'a de sens que si vous voulez travailler avec des éléments de caractère individuels ou si vous devez remplacer fréquemment des positions de tableau. – orad

2

Le sens de String ne correspond vraiment un ensemble de char. Donc, char[] en tant qu'implémentation, bien que ne signifiant pas ensemble, n'ajouterait pas la signification supplémentaire de String. OTOH, vous pouvez trouver la méthode utile dans String. D'autre part, java.util.Arrays a également des méthodes utiles telles que [binarySearch] [2].

Peut-être ce que vous voulez faire est d'introduire une abstraction pour un ensemble de char qui pourrait varier entre l'utilisation de la mise en œuvre String comme le plus simple qui pourrait éventuellement fonctionner, balayage linéaire d'un char[] (rapide si vous ne numérisez pas très loin) , recherche binaire, jeu de bits. clairsemés bit, haché, inondation filtrée, etc.

[2]: http://java.sun.com/javase/6/docs/api/java/util/Arrays.html#binarySearch(char[], int, int, char)

1

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 seulement parce que le profileur fera la mauvaise chose. JVMS moderne (JDk 6+) va générer le même code pour les deux accès une fois que la JVM décide que c'est assez chaud pour optimiser.

Pour répondre à votre question cependant; Si vous utilisez Java 5, utilisez des énumérations, si vous utilisez quelque chose avant Java5, utilisez le Java enumeration Pattern.

Il rendra plus facile à lire votre code, que vous ne aurez pas besoin de garder une trace des décalages quelque part, vous pouvez simplement utiliser l'énumération. De plus, il sera plus rapide, puisque vous serez en mesure de faire quelque chose comme:


    final char codeLetter = enum.getCodeLetter(); 
+1

Il n'y a aucune indication que enum est ce qu'il veut. S'il va utiliser les caractères comme des personnages quelque part, cela n'a aucun sens de les stocker comme enums. – DJClayworth

+0

Si les valeurs enum sont T, R, W, A, G alors toString() peut être utilisé. –

1

On dirait que votre devrait envisager d'utiliser un ENUM. Voir Enum Types

+1

Sans savoir ce que l'utilisation est ce n'est pas une bonne suggestion.S'il compare le personnage à d'autres personnages, alors une énumération n'a pas de sens. – DJClayworth

5

Les chaînes sont immuables, char [] ne l'est pas. Si vous définissez ceci comme une "constante" publique dans une classe, String est la constante réelle.

Par exemple, si vous avez ceci:

public class MyClass { 
    public static final char[] CODE_LETTERS = {'h', 'e', 'l', 'l', 'o'}; 
    .... 
} 

je peux être tout sournoise et faire:

MyClass.CODE_LETTERS[0] = 'Q'; 

Bam, je l'ai changé la valeur de votre "constante".

Le mot-clé final affecte uniquement la référence au tableau, il ne s'applique pas aux éléments du tableau. Je vois une erreur similaire tout le temps avec Collections.unmodifiableList(), les gens pensent qu'il protège leur liste mais le code client peut toujours accéder et modifier les éléments de la liste.

Pour répondre à votre question, utilisez la chaîne.

0

drôle, je viens d'écrire un blog entry ce sujet hier. Vous avez besoin d'une classe spécialisée enroulée autour du char []. Ma classe Characters est un moyen léger de conserver un ensemble immuable de caractères, et fournit des méthodes très efficaces pour des choses comme la recherche. C'est open source.

+0

Votre classe aurait trié ses personnages sur la construction de sorte qu'il ne répond pas vraiment à sa question, mais j'aime l'idée derrière la classe. Si je pouvais +1 votre message de blog dans son propre droit, je le ferais. – ahcox

+0

@ahcox, merci pour les gentils mots. J'ai ajouté la fonctionnalité "like" de Facebook à mon site de blog, alors n'hésitez pas à l'essayer! ;) –

Questions connexes