黑马程序员技术交流社区

标题: 字符和字节问题 [打印本页]

作者: 洪灿阳    时间: 2012-12-19 23:06
标题: 字符和字节问题
                String str="aaaa";
                byte[] by = str.getBytes();
                String s=by.toString();
                System.out.println(s);
                System.out.println(str.equals(s));


求解释为啥s不是“aaaa”??
作者: 崔政    时间: 2012-12-19 23:24
本帖最后由 崔政 于 2012-12-19 23:26 编辑

by是数组,你调用byte数组的toString()返回的自然是byte数组的形式。
这和

int [] arr=new int[]{1,2,3,4,5};
System.out.println(arr.toString());
是一个道理


如果你想要aaaa,可以这么做
        String str="aaaa";
        byte[] by = str.getBytes();
        String s=new String(by);
        System.out.println(s);
        System.out.println(str.equals(s));
作者: 洪灿阳    时间: 2012-12-19 23:29
洪灿阳 发表于 2012-12-19 23:06:47
                String str="aaaa";
                byte[] by = str.getBytes();
                Str

了解了,那如何实现字符转字节然后又转回原来的字符呢?
作者: 何创    时间: 2012-12-19 23:29
吼吼  很简单的嘛, 因为你原来是 String str="aaaa",后来你又byte[] by = str.getBytes();把字符串转换成了字节,而   String s=by.toString();这句转换的是字符串,最后System.out.println(str.equals(s));这句话来比较两个对象是否相等,一个是字节,一个是字符,也就是你拿字符"aaaa"和字节a a a a比较能相同吗?呵呵~~这是我的理解,你如果觉得不对 我们可以再一起研究研究。
作者: 洪灿阳    时间: 2012-12-19 23:30
崔政 发表于 2012-12-19 23:24:12
by是数组,你调用byte数组的toString()返回的自然是byte数组的形式。
这和

int [] arr=new int[]{1,2,3,4,5};
System.out.print

那如何实现字符转字节又转成原来的字符呢
作者: 崔政    时间: 2012-12-19 23:33
洪灿阳 发表于 2012-12-19 23:30
那如何实现字符转字节又转成原来的字符呢

我在沙发中已回复。
作者: 高境    时间: 2012-12-19 23:36
不打印 的是那个字节数组的地址值。
作者: 洪灿阳    时间: 2012-12-19 23:40
崔政 发表于 2012-12-19 23:24
by是数组,你调用byte数组的toString()返回的自然是byte数组的形式。
这和


嗯嗯,受教了。
作者: 焦健    时间: 2012-12-20 00:08
String s是字节数组调用toString方法的返回值,字节数组调用的是Object类中的toString方法,
Object 类的 toString 方法返回一个字符串,该字符串由类名(对象是该类的一个实例)、at 标记符“@”和此对象哈希码的无符号十六进制表示组成。
换句话说,该方法返回一个字符串,它的值等于: getClass().getName() + '@' + Integer.toHexString(hashCode())
所以打印到控制台上就是字节数组的哈希值,使用Object类的equals方法比较的是地址哈希值,字节数组的地址和字符串的地址不同,所以结果为false;
想要转换回“aaaa”可以使用String的构造方法来完成,当然,你也可以通过复写Object类中的toString方法来实现。
作者: 程宏志    时间: 2012-12-20 00:20
楼主你的疑问应该是概念混淆了。
               String str="aaaa";
                byte[] by = str.getBytes();
                String s=by.toString();//这样的使用你得首先知道,字节数组它有没有覆写Object的toString方法,Api中查看,它是没有覆写的,那么它的调用就是调用父类Object的toString方法,查看源码,我们可以知道,它打印的是引用对象在栈内存中的地址值。
  如果你想要打印它的值话话,可以调用String的构造方法:
       String ss=new String(by);这样就可以得到你的需求了;
   
                System.out.println(s);
                System.out.println(str.equals(s));
作者: 洪灿阳    时间: 2012-12-20 16:27
崔政 发表于 2012-12-19 23:24
by是数组,你调用byte数组的toString()返回的自然是byte数组的形式。
这和

你好!问下知道
获取客户端的信息,比如端口,还有上传过来的文件的名称和大小还有文件格式?如何实现吗?用java的方式




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