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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© Cola 中级黑马   /  2013-11-26 20:57  /  1940 人查看  /  14 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

  1. byte[] by={1,2,3,4};
  2. String s1=new String(by);
  3. sop(s1);
复制代码

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

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

结果

结果

评分

参与人数 1技术分 +1 收起 理由
FFF + 1 淡定

查看全部评分

14 个回复

倒序浏览
本帖最后由 HAnG 于 2013-11-26 21:04 编辑

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

评分

参与人数 1技术分 +1 收起 理由
FFF + 1 鼓励分+1

查看全部评分

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

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

byte[] b={1,2,3,4}   他们对应的字符集(ASCII码)就是那几个图案
回复 使用道具 举报
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位的二进制数。我们看到是个它的十进制数。

评分

参与人数 1技术分 +1 收起 理由
FFF + 1 神马都是浮云

查看全部评分

回复 使用道具 举报
注意这并非乱码,而是数组的内存地址空间,是由哈希算法计算得来,这几个符号就是哈希值
回复 使用道具 举报
这么给你解释吧:  
byte[] by={1,2,3,4};它定义了一个数组,有4个byte型数据,并把数组地址指向了by,地址是个十六进制的数。
String s1=new String(by);通过使用平台的默认字符集解码指定的 byte 数组,构造一个新的 String。
  若你想使输出的结果是1,2,3,4.要通过数组名和角标来表示这个数。并将它打印。

评分

参与人数 1技术分 +1 收起 理由
FFF + 1 赞一个!

查看全部评分

回复 使用道具 举报
王贺 中级黑马 2013-11-26 22:09:04
10#
byte[] by={1,2,3,4};
String s1=new String(by);
简单的走一下过程,byte数组,类型还是数字型的,把它封装为字符串,中间还有一个过程,先把每个数字转换成字符型:也就是把每个数组元素转换成字符型,可以具体操作下,System.out.println((char)a); 这行代码可以理解吧,然后再把转换过来的字符数组转换成字符串;
举个例子吧,char c=(char)1; 输出:;

评分

参与人数 1黑马币 +6 收起 理由
FFF + 6 今日加分已达到上限!请明天再努力哦!.

查看全部评分

回复 使用道具 举报
2楼正解
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马