7
votes

Java: Taille de l'octet de Char vs string

J'ai été surpris de constater que le code suivant xxx

sortira ce:

Taille du personnage: 2

taille de la chaîne: 1

Je supposerais qu'une seule chaîne de caractères devrait reprendre les mêmes octets (ou plus) qu'un seul caractère.

en particulier je me demande.

Si j'ai un haricot Java avec plusieurs champs, comment sa taille augmentera en fonction de la nature des champs (caractère, chaîne, booléen, vecteur, etc.) Je suppose que tous les objets Java en ont certains (probablement minimal) empreinte, et que l'une des plus petites de ces empreintes de pas serait un seul caractère. Pour tester cette hypothèse de base, j'ai commencé avec le code ci-dessus - et les résultats des déclarations d'impression semblent contre-intuitive.

Toute perspective dans la manière dont les magasins Java / Serialises Les caractères VS Strings par défaut seraient très utiles.


4 commentaires

La longueur d'une chaîne est le nombre de caractères qu'il contient. Un caractère peut être codé dans plus d'un octet.


La chaîne est très probablement codée UTF-8, de sorte que "A" ne prend qu'un octet.


Le minimum absolu Chaque développeur de logiciel absolument doit connaître de manière positive à propos de Unicode et des ensembles de caractères (aucune excuse!) < / a>


@Niklasb. Ou plutôt un format de type UTF-16 UTF-16 (UCS-2).


5 Réponses :


10
votes

getBytes () sorties La chaîne avec le codage par défaut (le plus probable iso-8859-1 ) pendant que le caractère interne a toujours 2 octets. Java interne utilise toujours des tableaux de caractères avec un char de 2 octets, si vous voulez en savoir plus sur le codage, lisez le lien par Oded dans les commentaires de la question.


3 commentaires

Pour référence, getbytes () ne vous dit pas la consommation de mémoire réelle de la chaîne .


Je ne pense pas que cette déclaration est correcte: "Java interne utilise toujours des tableaux de caractères avec un caractère de 2 octets." Vous pouvez voir ce lien: Javarevisited.blogspot. com.tr/2012/01/... pour moi, Java a utilisé UTF-8 comme codage par défaut dans le code.


@Koraytugay Vous mélangez probablement la représentation de la mémoire interne de Unicode à Java (Oui, chaque implémentation de charcuterie comme la chaîne utilise toujours 2 caractères d'octets au format UTF-16) et que les représentations internes d'importation ou d'exportation de Java (fichier, réseau) dans des codages d'octets spécifiques. Si vous croyez toujours que votre version Java (qui est ...?) Utilise en interne UTF-8, comment avez-vous prouver que? Au fait, le problème des getbytes () est que la fonction est très ancienne, elle était déjà là dans la version 1.1 lorsque UTF-8 n'était pas encore prise en charge, vous ne pouvez donc pas vraiment prédire qu'il utilise UTF-8.



-1
votes

La taille d'un caractère est le stockage nécessaire pour un char, ce qui est 16 bits. La longueur d'une chaîne (également la longueur de la matrice de caractère sous-jacente ou d'octets-array) est le nombre de caractères (ou octets), pas une taille de bit.

C'est pourquoi vous aviez fait à la division par 8 pour la taille, mais pas pour la longueur. La longueur doit être multipliée par deux.

Notez également que vous obtiendrez d'autres longueurs pour le tableau des octets si vous spécifiez un codage différent. Dans ce cas, une transformation en un codage à une taille unique ou variable a été réalisée lors de GetBytes ().

Voir: http://docs.oracle.com/javase/6/docs/api/java/lang/string.html#getbytes (java.nio.charset.charsset )


2 commentaires

Non, il a utilisé getbytes () , alors ce qu'il obtient est en fait le nombre d'octets (ce qui n'est pas surprenant aussi bien).


Oui, cette réponse est un peu hors sujet et mécharacterise la question ... Je suggère une mise à jour.



2
votes

Je voudrais dire ce que je pense, corrigez-moi si je me trompe, mais vous trouvez la longueur de la chaîne qui est correctement montrée comme 1 que vous n'avez que 1 caractère dans la chaîne. La longueur montre la longueur non la taille. la longueur et la taille sont deux choses différentes.

Vérifiez ce Link .. Vous trouvez le nombre d'octets occupés dans le mauvais sens


0 commentaires

0
votes

Eh bien, vous avez que 1 caractère de charcuterie a la taille de 2 octets et que votre chaîne contient 1 caractère de 1 caractère, non de la taille d'un octet.

la chaîne code> de la chaîne code> En Java consiste en: P>

private final char value[];
private final int offset;
private final int count;
private int hash;


1 commentaires

Cela n'a pas de sens, pouvez-vous essayer d'améliorer la grammaire ... etc.?



0
votes

Je veux ajouter du code d'abord, puis un peu d'explication: xxx pré>

et la sortie sera la suivante: p> xxx pré>

Ce qui vous manque réellement, vous ne fournissez aucun paramètre à la méthode forte> getbytes forte>. Probablement, vous obtenez les octets de la représentation UTF-8 du personnage 'A'. P>

Eh bien, mais pourquoi avons-nous eu 4 octets, lorsque nous avons demandé UTF-16? OK, Java utilise UTF-16 en interne, puis nous devrions avoir 2 octets à droite? P>

Si vous examinez la sortie: P>

feff061


0 commentaires