7
votes

Comment puis-je convertir une chaîne en caractères [] sans copier l'objet?

J'ai une chaîne et j'ai besoin de le traverser en tant que tableau de caractères. Bien sûr, la méthode normale est d'utiliser TOCHARARRAY () CODE>

public char[] toCharArray() {
    // Cannot use Arrays.copyOf because of class initialization order issues
    char result[] = new char[value.length];
    System.arraycopy(value, 0, result, 0, value.length);
    return result;
}


3 commentaires

Connexion directe à une référence directe à un chargeur [] d'un objet censé être immuable, serait une très mauvaise idée, surtout si l'objet immuable en question si de type chaîne , qui doit remplir des rôles pertinents de sécurité.


Si vous souhaitez enregistrer un espace mémoire, ne demandez pas le tableau char [] . Vous n'avez pas expliqué, pourquoi vous pensez avoir besoin de cela.


J'ai besoin d'un tableau afin que je puisse itérer à travers elle par index. Cependant, ce que je n'avais pas réalisé et ce que Nicolas Filotto a souligné que les chaînes sont simplement une classe qui stocke la chaîne dans un Char [] tableau. ! Débutants erreur :)


3 Réponses :


3
votes

Voici comment vous pouvez parcourir une chaîne code> en quelque sorte sous forme de tableau code> char code> sans utiliser TOCHARARRAY () CODE>:

for (int i = 0; i < str.length(); i++) {
    char c = str.charAt(i);
}


4 commentaires

Eh bien, pas le "IT" que l'OP a demandé ... Si l'OP n'a qu'une méthode n'acceptant un char [] qu'ils ne peuvent pas modifier, par exemple, cela ne va pas Aide du tout.


Et où vous stockez ces caractères générés?


"J'ai une chaîne et j'ai besoin de la traverser comme une matrice de caractère" C'est la demande principale de l'OP, ce que je propose de l'aide pour traverser la chaîne, si ce n'est pas ce que l'OP attend qu'il a besoin de modifier la question


C'est vraiment ce que je voulais! Cela souligne quelque chose que je n'ai pas réalisé, ce que la corde de classe stocke simplement son contenu dans une matrice de caractère appelée valeur []. Utilisation de Str.Charat (Int Index) renvoie simplement la valeur [Index]



14
votes

Non, ce n'est pas le cas. Pas sans réflexion, que vous devriez éviter. Message avec le sous-jacent Char [] dans une chaîne via réflexion est une recette pour les bogues subtils. Vous pouvez accéder à des caractères individuels dans une chaîne à l'aide de charat , mais si vous avez vraiment besoin d'un char [] Vous devez simplement appeler TOCHARARRAY .

Si cela n'est pas possible, y a-t-il une raison pour?

première raison: encapsulation. Le tableau est un détail de mise en œuvre privé.

Seconde Raison: Immutabilité. Les chaînes sont immuables, mais les matrices jamais sont. Donc, vous pouvez modifier le tableau de caractères sous-jacent et la chaîne serait mutée, dont la surprise de tout développeur s'appuie sur l'immuabilité normale.


2 commentaires

Et en plus, d'autres références à la même chaîne du pool de string auraient également la même chaîne mutée, entraînant une plus grande confusion.


@ Pokechu22: Pire encore pire, les stratégies de sécurité (autorisations, sources de code, noms d'utilisateur) sont stockées comme des chaînes, ce qui permet de les modifier saperait tout le modèle de sécurité.



3
votes

Étant donné que vous attendez le tableau, il n'ya aucun moyen d'obtenir un tableau sans créer de nouveau tableau.

C'est le moyen le plus propre. Même si vous créez votre propre fonction et que vous faites une affaire, vous finirez par créer un nouveau tableau.

Allez avec vos codes actuels.


0 commentaires