黑马程序员技术交流社区

标题: java 中一个英文字母占用几个字节? [打印本页]

作者: yeluoxingye    时间: 2017-3-11 16:30
标题: java 中一个英文字母占用几个字节?
java中String类型是由char组成的,一个char占用两个字节(byte)。"S".getBytes()应该返回两个byte才对,怎么只返回了一个?另外如果是汉字的话,可以返回两个byte。 
问题补充:我的意思是:在java定义中char类型采用unicode编码,占用两个字节,也就是十六位。但是"S".getBytes().length的结果却是 1 ,说明只占用了一个byte,应该是2才对啊,这是什么原因?我估计是:输出的字符串占用的字节数与机器上存储时占用的字节数不同。欢迎大家讨论

作者: laoshaoa    时间: 2017-3-11 16:43
,,,,,,,不懂,.,,晕

作者: yeluoxingye    时间: 2017-3-11 22:32
大神呢?

作者: hailong5214    时间: 2017-3-11 22:40
你说的不对啊                        
作者: xiaoxipeng    时间: 2017-3-11 23:01
char类型都是单字符,一个字符只占用一个字节
作者: Mr_Maty    时间: 2017-3-12 00:06
getBytes的返回值是byte[],你再.length当然是求得数组的长度,数组的长度是1,结果当然是1了

作者: lvshen9    时间: 2017-3-12 09:04
数组长度和字节有很大区别

作者: mrwalker    时间: 2017-3-14 11:51
6楼正解
作者: Tupurp    时间: 2017-3-17 17:09
Mr_Maty 发表于 2017-3-12 00:06
getBytes的返回值是byte[],你再.length当然是求得数组的长度,数组的长度是1,结果当然是1了
...

那试试定义一个两个字符串比如  String  str ="比如";和一个  String  str1= "biru";
执行输出str.getbytes().length和str1.getbytes().length
结果都是4
作者: 李向阳。    时间: 2017-3-17 17:10
char类型,占用1个字节

作者: Tupurp    时间: 2017-3-17 18:36
那你不应该用getbytes().length  而应该用toCharArray().length
作者: Mr_Maty    时间: 2017-3-17 23:46
Tupurp 发表于 2017-3-17 17:09
那试试定义一个两个字符串比如  String  str ="比如";和一个  String  str1= "biru";
执行输出str.getbyt ...

1.难得看到有这么喜欢专研的,先给个赞(时间有限,我简单解释下)
2.JAVA使用UTF-16的编码(Unicode编码的一种解决方案),该编码方式使用定长,即16位来标识一个"字符"注意该处的字符不是基本数据类型Character),也就是两个字节,所以你看到char类型以及byte类型的大小都是两个字节(因为两个字节所表示的范围已经足够囊括这些,或者说可以囊括常用的).
3.但是使用8个bit为就可以标识所有英语字符以及英语标点,使用16bit来标识就显得浪费时间了,所以如果是ASCII字符,就会8bit来存储(该处设计到可变长的编码方式,如有疑问,请自行百度),汉字使用8bit是不存用来对应处所有汉字的(或者说常用汉字),所以他采用16bit来标识
4.总体来讲,可变长编码方案可以有效利用空间.
5.那么问题来了,计算机如何识别到底该用多少bit来存储该字符那???在可变长编码方案中,每byte种会被插入标志信息,计算机在读取该字符是,首先它会读取该标志位,如果该标志位代表英文字符,它就使用8bit来存储,如果代表汉字,就使用16bit存储.
6.通常字符集会是ASCII编码的超集,因为英语的使用范围太广泛,也就是说,计算机在存储过程中对英语字符都是使用8bit进行存储
7.验证方式:将byte[]打印出来看看即可



作者: 旧时光9527    时间: 2017-3-18 00:37
Mr_Maty 发表于 2017-3-17 23:46
1.难得看到有这么喜欢专研的,先给个赞(时间有限,我简单解释下)
2.JAVA使用UTF-16的编码(Unicode编码的一 ...

解析的比较底层了,汉子两个字节,字母一个字节,那么符号是怎么存储的,比如@#
作者: Mr_Maty    时间: 2017-3-18 00:45
旧时光9527 发表于 2017-3-18 00:37
解析的比较底层了,汉子两个字节,字母一个字节,那么符号是怎么存储的,比如@# ...

你把符号转化成byte数组打印出来不就知道了

作者: Mr_Maty    时间: 2017-3-18 00:46
旧时光9527 发表于 2017-3-18 00:37
解析的比较底层了,汉子两个字节,字母一个字节,那么符号是怎么存储的,比如@# ...

符号通常是ascii表示的,不排除某些非英语国家使用的符号,那么用ascii就不能存储,具体看实际情况,你那个@和#应该是ascii,你可以打印下看看

作者: 旧时光9527    时间: 2017-3-18 01:06
旧时光9527 发表于 2017-3-18 00:37
解析的比较底层了,汉子两个字节,字母一个字节,那么符号是怎么存储的,比如@# ...

每byte种会被插入标志信息,计算机在读取该字符是,首先它会读取该标志位,如果该标志位代表英文字符,它就使用8bit来存储,如果代表汉字,就使用16bit存储.
各种符号也有标志位嘛,也会判断标志位?
作者: 旧时光9527    时间: 2017-3-18 01:07
旧时光9527 发表于 2017-3-18 00:37
解析的比较底层了,汉子两个字节,字母一个字节,那么符号是怎么存储的,比如@# ...

每byte种会被插入标志信息,计算机在读取该字符是,首先它会读取该标志位,如果该标志位代表英文字符,它就使用8bit来存储,如果代表汉字,就使用16bit存储.
@#等符号也有标志位嘛,也会判断标志位?




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2