A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

java中String类型是由char组成的,一个char占用两个字节(byte)。"S".getBytes()应该返回两个byte才对,怎么只返回了一个?另外如果是汉字的话,可以返回两个byte。 
问题补充:我的意思是:在java定义中char类型采用unicode编码,占用两个字节,也就是十六位。但是"S".getBytes().length的结果却是 1 ,说明只占用了一个byte,应该是2才对啊,这是什么原因?我估计是:输出的字符串占用的字节数与机器上存储时占用的字节数不同。欢迎大家讨论
来自宇宙超级黑马专属苹果客户端来自宇宙超级黑马专属苹果客户端

17 个回复

倒序浏览
回复 使用道具 举报
回复 使用道具 举报
你说的不对啊                        
回复 使用道具 举报
char类型都是单字符,一个字符只占用一个字节
回复 使用道具 举报
getBytes的返回值是byte[],你再.length当然是求得数组的长度,数组的长度是1,结果当然是1了

点评

正解  发表于 2017-3-14 22:02
来自宇宙超级黑马专属苹果客户端来自宇宙超级黑马专属苹果客户端
回复 使用道具 举报 1 0
数组长度和字节有很大区别
来自宇宙超级黑马专属安卓客户端来自宇宙超级黑马专属安卓客户端
回复 使用道具 举报
6楼正解
回复 使用道具 举报
Tupurp 初级黑马 2017-3-17 17:09:40
9#
Mr_Maty 发表于 2017-3-12 00:06
getBytes的返回值是byte[],你再.length当然是求得数组的长度,数组的长度是1,结果当然是1了
...

那试试定义一个两个字符串比如  String  str ="比如";和一个  String  str1= "biru";
执行输出str.getbytes().length和str1.getbytes().length
结果都是4
回复 使用道具 举报
char类型,占用1个字节
来自宇宙超级黑马专属苹果客户端来自宇宙超级黑马专属苹果客户端
回复 使用道具 举报
那你不应该用getbytes().length  而应该用toCharArray().length
回复 使用道具 举报
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[]打印出来看看即可


回复 使用道具 举报
Mr_Maty 发表于 2017-3-17 23:46
1.难得看到有这么喜欢专研的,先给个赞(时间有限,我简单解释下)
2.JAVA使用UTF-16的编码(Unicode编码的一 ...

解析的比较底层了,汉子两个字节,字母一个字节,那么符号是怎么存储的,比如@#
回复 使用道具 举报
旧时光9527 发表于 2017-3-18 00:37
解析的比较底层了,汉子两个字节,字母一个字节,那么符号是怎么存储的,比如@# ...

你把符号转化成byte数组打印出来不就知道了
来自宇宙超级黑马专属苹果客户端来自宇宙超级黑马专属苹果客户端
回复 使用道具 举报
旧时光9527 发表于 2017-3-18 00:37
解析的比较底层了,汉子两个字节,字母一个字节,那么符号是怎么存储的,比如@# ...

符号通常是ascii表示的,不排除某些非英语国家使用的符号,那么用ascii就不能存储,具体看实际情况,你那个@和#应该是ascii,你可以打印下看看
来自宇宙超级黑马专属苹果客户端来自宇宙超级黑马专属苹果客户端
回复 使用道具 举报
旧时光9527 发表于 2017-3-18 00:37
解析的比较底层了,汉子两个字节,字母一个字节,那么符号是怎么存储的,比如@# ...

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

每byte种会被插入标志信息,计算机在读取该字符是,首先它会读取该标志位,如果该标志位代表英文字符,它就使用8bit来存储,如果代表汉字,就使用16bit存储.
@#等符号也有标志位嘛,也会判断标志位?
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马