Quelle est la manière la plus efficace de créer le premier caractère d'une String
minuscule?
Je peux penser à plusieurs façons de procéder:
Utilisation charAt()
avecsubstring()
String input = "SomeInputString";
String output = Character.toLowerCase(input.charAt(0)) +
(input.length() > 1 ? input.substring(1) : "");
Ou en utilisant un char
tableau
String input = "SomeInputString";
char c[] = input.toCharArray();
c[0] = Character.toLowerCase(c[0]);
String output = new String(c);
Je suis sûr qu'il existe de nombreux autres moyens pour y parvenir. Que recommandez-vous?
c[0] |= ' ';
Réponses:
J'ai testé les approches prometteuses en utilisant JMH . Code de référence complet .
Hypothèse lors des tests (pour éviter de vérifier les cas d'angle à chaque fois): la longueur de la chaîne d'entrée est toujours supérieure à 1.
Résultats
Les scores sont des opérations par seconde, plus il y en a, mieux c'est.
Des tests
test1
était d'abord l'approche d'Andy et Hllink:test2
était la deuxième approche d'Andy. Il est égalementIntrospector.decapitalize()
suggéré par Daniel, mais sans deuxif
déclarations. First aif
été supprimé en raison de l'hypothèse de test. Le second a été supprimé, car il enfreignait l'exactitude (c'est-à-dire que l'entrée"HI"
reviendrait"HI"
). C'était presque le plus rapide.test3
était une modification detest2
, mais au lieu deCharacter.toLowerCase()
, j'ajoutais 32, qui fonctionne correctement si et seulement si la chaîne est en ASCII. C'était le plus rapide.c[0] |= ' '
du commentaire de Mike a donné la même performance.test4
utiliséStringBuilder
.test5
utilisé deuxsubstring()
appels.test6
utilise la réflexion pour changerchar value[]
directement dans String. C'était le plus lent.Conclusions
Si la longueur de la chaîne est toujours supérieure à 0, utilisez
test2
.Sinon, nous devons vérifier les cas d'angle:
Si vous êtes sûr que votre texte sera toujours en ASCII et que vous recherchez des performances extrêmes car vous avez trouvé ce code dans le goulot d'étranglement, utilisez
test3
.la source
Je suis tombé sur une bonne alternative si vous ne souhaitez pas utiliser une bibliothèque tierce:
la source
Quand il s'agit de manipulation de chaînes, jetez un œil à Jakarta Commons Lang StringUtils .
la source
Si vous souhaitez utiliser Apache Commons, vous pouvez effectuer les opérations suivantes:
Résultat: someString
la source
compile group: 'org.apache.commons', name: 'commons-text', version: '1.2'
Malgré une approche orientée char, je suggérerais une solution orientée String. String.toLowerCase est spécifique aux paramètres régionaux, je prendrais donc en compte ce problème.
String.toLowerCase
est de préférer les minuscules selon Character.toLowerCase . De plus, une solution orientée char n'est pas entièrement compatible avec unicode, car Character.toLowerCase ne peut pas gérer les caractères supplémentaires.MISE À JOUR: À titre d'exemple à quel point le paramètre régional est important, laissez-nous en minuscules
I
en turc et en allemand:produira deux résultats différents:
la source
Les chaînes en Java sont immuables, donc dans les deux cas, une nouvelle chaîne sera créée.
Votre premier exemple sera probablement un peu plus efficace car il suffit de créer une nouvelle chaîne et non un tableau de caractères temporaire.
la source
Une méthode statique très courte et simple pour archiver ce que vous voulez:
la source
Si ce dont vous avez besoin est très simple (par exemple, noms de classe java, pas de paramètres régionaux), vous pouvez également utiliser la classe CaseFormat dans la bibliothèque Google Guava .
Ou vous pouvez préparer et réutiliser un objet convertisseur, ce qui pourrait être plus efficace.
Pour mieux comprendre la philosophie de la manipulation des chaînes de Google Guava, consultez cette page wiki .
la source
la source
Je n'ai rencontré cela qu'aujourd'hui. J'ai essayé de le faire moi-même de la manière la plus piétonne. Cela a pris une ligne, bien que longue. Voici
Donne:
Avant str = TaxoRanks
Après str = taxoRanks
la source
Résultat:
la source