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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© boboyuwu 高级黑马   /  2015-8-11 07:41  /  3782 人查看  /  12 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

4黑马币
为什么直接输出buffer字符数组没事,但是在println()里面写个字符串后面接着字符数组就会出现乱码  求大神解惑

现象1.png (168.68 KB, 下载次数: 110)

现象1.png

现象2.png (194.99 KB, 下载次数: 127)

现象2.png

最佳答案

查看完整内容

首先那不是乱码,那是你的数组在内存中的地址值,现象1是因为在你输出的时候用了toString方法,出现现象2是你加了一段字符串进去,在输出的时候就会直接把buffer在栈内存中的地址值转换成字符串打印出来了,你可以加上这句 String string = new String(buffer);在输出的时候把buffer改成string就好了

12 个回复

倒序浏览
首先那不是乱码,那是你的数组在内存中的地址值,现象1是因为在你输出的时候用了toString方法,出现现象2是你加了一段字符串进去,在输出的时候就会直接把buffer在栈内存中的地址值转换成字符串打印出来了,你可以加上这句 String string = new String(buffer);在输出的时候把buffer改成string就好了
回复 使用道具 举报
第二个的默认输出地址了。。。建议转成string再输出
回复 使用道具 举报
houweicheng 发表于 2015-8-11 10:07
第二个的默认输出地址了。。。建议转成string再输出

默认输出地址?什么意思啊能解释详细些么
回复 使用道具 举报
boboyuwu 发表于 2015-8-11 10:12
默认输出地址?什么意思啊能解释详细些么

。。。这个我也不太清楚了,试下tostring()之后还有这个问题么?
回复 使用道具 举报
houweicheng 发表于 2015-8-11 10:16
。。。这个我也不太清楚了,试下tostring()之后还有这个问题么?

试了问题还在
回复 使用道具 举报
亦如梦幻泡影 发表于 2015-8-11 17:01
首先那不是乱码,那是你的数组在内存中的地址值,现象1是因为在你输出的时候用了toString方法,出现现象2是 ...

第一个我没用tistring()啊   
回复 使用道具 举报
这个很简单啊,我来教你,第二个之所以打印那样是因为("读取的字符为"+buffer) 如果加上字符串的话 会有类型提升的  也就是把字符数组提升成字符串数组了,所以打印的那个c@4e。。其实就是提升后的数组在内存中的首地址! 毕老师视频里有的
回复 使用道具 举报
你不信还是加上字符串后面写+buffer[0] 打印的肯定是:你
回复 使用道具 举报
boboyuwu 发表于 2015-8-11 18:51
第一个我没用tistring()啊

说错了 是现象2中的语句相当于System.out.println("获取的字符序列"+buffer.toString());
buffer.toString()打印出来的就是地址值
回复 使用道具 举报
System.out.println("获取的字符序列"+new String(buffer,0,buffer.length));打印出来就是你要的值了。
你的打印出的不是乱码,后边那一串代表的是[C@some,[代表数组,C代表char类型,@some指的这个对象的哈希地址值。其实buffer就是指向这个地址值,它的toString()方法就是将这个地址值打印,自己重写这个toString()方法,按照你需要的方式打印,这样在执行你的操作时也能获得你需要的数据。
回复 使用道具 举报
a2029460 发表于 2015-8-11 18:54
这个很简单啊,我来教你,第二个之所以打印那样是因为("读取的字符为"+buffer) 如果加上字符串的话 会有类 ...

毕老师的哪一集里面有啊  我去看看
回复 使用道具 举报
第二个你打印出来的是地址值,要打印出数组里的字符就要把字符用字符串的形式打出来,
这样的    "读取的字符为:"new String(buffer);
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马