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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 长跑※终点 中级黑马   /  2014-8-6 01:29  /  1407 人查看  /  4 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 长跑※终点 于 2014-8-6 01:32 编辑

请问下,运行下面的代码。输入:ABCDabcd 的结果是:[C@5e55ab。是什么原因?哪位知道原因的吗?告诉下我,先谢了。
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;

public class Test7 {

        
        public static void main(String[] args) {
                System.out.println("请输入一串英文字母,并以回车进行转换");
                BufferedReader bfr = new BufferedReader(new InputStreamReader(System.in));
                BufferedWriter bfw = new BufferedWriter(new OutputStreamWriter(System.out));
                String s;
                try {
                     
                        while((s = bfr.readLine())!=null){
                                //先将拿到的字符串给变成字符数组,将每个字母都给拆分开来。
                                char[] ch =s.toCharArray();
                                for(int i = 0; i<ch.length; i++){
                                        //判断该字符是否是小写字母,是的话就变成大写,再写回字符数组。
                                        if(ch>='a'&&ch<='z'){
                                                ch = Character.toUpperCase(ch);
                                                //判断该字符是否是大写字母,是的话就变成小写,再写回字符数组。
                                        }else if(ch>='A'&&ch<='Z'){
                                                ch = Character.toLowerCase(ch);
                                        }
                                }
/------------------------------------------------------------------------------------------------------------------------------------------------
                                 //就是这两行!!!!!!!!如果把这两行换成:bfw.write(ch);就正常了。这是什么原因呢?
                                 //把输入流读取到的String转成char【】写入输出流就没有问题。
                               //但是把输入流读取到的String转成char【】,再转成String写入输出流就出问题了。好奇怪。
                                String a = ch.toString();   
                                bfw.write(a);
/-------------------------------------------------------------------------------------------------------------------------------------------------
                           
                                bfw.newLine();
                                bfw.flush();
                        }
                } catch (IOException e) {
                        
                        System.out.println("转换失败");
                }
                try {
                        bfr.close();
                        bfw.close();
                } catch (IOException e) {
                        
                        System.out.println("流关闭出错");
                }
               

        }

}


4 个回复

倒序浏览
我想可能是这样的:ch虽然是引用类型的变量,它有toString()方法,但是它指向的数组中的各个字符元素并没有toString()方法。
我感觉这道题的问题在于,因为引用型变量ch指向的是数组在内存中的地址值,所以你调用它的toString()方法后,它得到的是地址值的字符串表示,然后你把这个字符串赋给a,a也是地址值,而不是它代表的具体字符串。要想把字符数组中的元素转化为字符串,不能用toString(),用构造函数转化法或者相应的静态函数转化法应该都行。也就是你把“String a = ch.toString(); ”换成String a= new String(ch);或者String a=String.valueOf(ch);应该都行,你可以试试看,结果好像没问题,我也就只理解到这种水平了,只能帮你到这了,呵呵。

点评

谢谢!  发表于 2014-8-6 13:11
回复 使用道具 举报
同上。使用String.valueOf(ch)。试一下。。。toString不一定返回的是你需要的字符串。但是String.valueOf(ch) 是肯定能将 字节字节数组转成字符串的

点评

好的,谢谢。  发表于 2014-8-6 13:12
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马