黑马程序员技术交流社区

标题: 输出的为什么不是1234呢? [打印本页]

作者: Cola    时间: 2013-11-26 20:57
标题: 输出的为什么不是1234呢?
  1. byte[] by={1,2,3,4};
  2. String s1=new String(by);
  3. sop(s1);
复制代码

结果如图,是一些表情符号,请问为什么呢?

wenti3.JPG (1.65 KB, 下载次数: 31)

结果

结果

作者: HAnG    时间: 2013-11-26 21:00
本帖最后由 HAnG 于 2013-11-26 21:04 编辑

因为
byte[] by={1,2,3,4};
String s1=new String(by);
是把数组传给s1,每一个数组元素对应一个字符,而不是s1="1234",可以看下String类的构造方法。

作者: RuntimeError!    时间: 2013-11-26 21:05
楼上说的不对
问题在于by的数据类型,by为字节型,属于数字,而string的时候转换成了字符型,就相当于按照ascii码编码转换了过去,显示的是字符串 ,是ascii=1 2 3 4的四个东西。。应该是小图案~
作者: 默狼    时间: 2013-11-26 21:18
你在String s1 = new String(by);的时候相当于对by做了一次类型转换,因此不是1,2,3,4.
作者: freehiker    时间: 2013-11-26 21:29
因为是byte数组,1通过ascii编码得到的就是你那些字符,你看一下ascii编码表就知道了。
若是 char数组,那你就会得到1234
作者: Cway㊣    时间: 2013-11-26 21:32
本帖最后由 Cway㊣ 于 2013-11-26 21:34 编辑

String(byte[] bytes)
          通过使用平台的默认字符集解码指定的 byte 数组,构造一个新的 String。

byte[] b={1,2,3,4}   他们对应的字符集(ASCII码)就是那几个图案

作者: 还不到时候    时间: 2013-11-26 21:38
new String(by)这是解码,将by数组中每个字节参考ASCII码表中进行查表,1查的是0000-0001对应的字符,2查的是0000-0010对应的字符,3查的是0000-0011对应的字符,4查的是0000-0100对应的字符。将这些字符组成一个字符串输出到控制台就是你看到的结果,至于为什么是那些字符,可以查看下ASCII码表。
如果byte[] by = {49,50,51,52}; 输出的结果就是1234
byte型的数组中每个元素都是一个字节,也就是8个bit位的二进制数。我们看到是个它的十进制数。
作者: 胡建伟    时间: 2013-11-26 21:44
注意这并非乱码,而是数组的内存地址空间,是由哈希算法计算得来,这几个符号就是哈希值
作者: 张天昊76    时间: 2013-11-26 22:00
这么给你解释吧:  
byte[] by={1,2,3,4};它定义了一个数组,有4个byte型数据,并把数组地址指向了by,地址是个十六进制的数。
String s1=new String(by);通过使用平台的默认字符集解码指定的 byte 数组,构造一个新的 String。
  若你想使输出的结果是1,2,3,4.要通过数组名和角标来表示这个数。并将它打印。
作者: 王贺    时间: 2013-11-26 22:09
byte[] by={1,2,3,4};
String s1=new String(by);
简单的走一下过程,byte数组,类型还是数字型的,把它封装为字符串,中间还有一个过程,先把每个数字转换成字符型:也就是把每个数组元素转换成字符型,可以具体操作下,System.out.println((char)a); 这行代码可以理解吧,然后再把转换过来的字符数组转换成字符串;
举个例子吧,char c=(char)1; 输出:;


作者: 樊志伟    时间: 2013-11-26 22:18
2楼正解




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