黑马程序员技术交流社区

标题: 关于valueOf [打印本页]

作者: 邵阳    时间: 2012-7-15 18:47
标题: 关于valueOf
class  Test
{
        public static void main(String[]args)
        {
                char[]arr={'a','s','f','h'};
                String[]str={"123","456","789"};
                String a=String.valueOf(arr);
                String b=String.valueOf(str);
                System.out.println("字符:"+a);
                System.out.println("字符串:"+b);
        }
}
为什么输出
D:\java\zuoye\zifuchuan>java  Test
字符:asfh
字符串:[Ljava.lang.String;@119dc16


为什么不输出123456789。而输出哈希值。
作者: 许瑞航老师    时间: 2012-7-15 19:17
String.valueOf方法传入的参数有char数组类型的,但是没有String数组类型的,因此


String a=String.valueOf(arr);//在这里会转换成字符串
String b=String.valueOf(str);//在这里只会把str的地址值,也就是你说的哈希值转换成字符串存入b中。


你仔细看看valueOf方法的源代码就能明白的。
作者: 贾飞雨    时间: 2012-7-15 19:21
static String valueOf(char[] data) 这个里面是char数组,在API里面的解释是:返回 char 数组参数的字符串表示形式。也就是char类型转换为String类型的,所以可以打印String类的数组,
而你下面的这个传入的是String 类型的字符串数组,也就是说你调用的是这个static String valueOf(Object obj) , 本身就是String类型 的还怎么转呢?所以打印出来就是
[Ljava.lang.String;@119dc16      String类型的哈希地址值,在这里他没有转换,上面那个他转换 了


作者: 丁二跃    时间: 2012-7-15 19:27
因为 String valueOf 方法对 他们的处理不相同 看源码就可以了:

   public static String valueOf(Object obj) {
        return (obj == null) ? "null" : obj.toString();
    }

public static String valueOf(char data[]) {
        return new String(data);
    }
作者: 王飞    时间: 2012-7-15 19:33


class  Test
{
        public static void main(String[]args)
        {
                char[]arr={'a','s','f','h'};
                String[]str={"123","456","789"};
                String a=String.valueOf(arr);
                String b=String.valueOf(str);   //你这里的方法应该是这个:valueOf(Object obj),你这里的传入的str是内存中String[]str={"123","456","789"};这个数组的地址值(哈希值)
                你又把String 类的变量 b 指向了这个哈希值,所以你下面打出来的也就是哈希值了

                System.out.println("字符:"+a);
                System.out.println("字符串:"+b);
        }
}
作者: 任文杰    时间: 2012-7-15 20:48
通过查看API文档,String类的方法valueOf(Char[] data)表示 返回 char 数组参数的字符串表示形式。这个很好理解,关键是:[Ljava.lang.String;@119dc16 这行输出结果,首先看下String类当中的方法valueOf(Object obj),此方法表示返回参数obj的字符串表示形式,从而会调用obj对象的toString()方法,此方法的描述是这样的:

Object 类的 toString 方法返回一个字符串,该字符串由类名(对象是该类的一个实例)、at 标记符“@”和此对象哈希码的无符号十六进制表示组成。换句话说,该方法返回一个字符串,它的值等于:

getClass().getName() + '@' + Integer.toHexString(hashCode())。

而getClass().getName()方法会根据obj的类型返回相应的值,在些不赘述,可以看下类Class的getName()方法,就明白了。
作者: 。_Smileヾ淡莣    时间: 2012-7-15 23:15
class  Test
{
        public static void main(String[]args)
        {
                char[]arr={'a','s','f','h'};
                String[]str={"123","456","789"};
                String a=String.valueOf(arr);
                String b=String.valueOf(str);
                System.out.println("字符:"+a);
                System.out.println("字符串:"+b);
        }
}

String类的方法valueOf 返回 char 数组参数的字符串表示形式
String[]str={"123","456","789"};
  String b=String.valueOf(str);   //你这里的方法应该是这个:valueOf(Object obj),你这里的传入的str是内存中String[]str={"123","456","789"};这个数组中打印直接为哈希值;
如果你想打印123456789的话需要把这个字符串数组中的元素获取出来如:
package cn.itcast.Demo1;

class  Test
{
        public static void main(String[]args)
        {
                char[]arr={'a','s','f','h'};
                String[]str={"123","456","789"};
                String a=String.valueOf(arr);
//                String b=String.valueOf(str);
                System.out.println("字符:"+a);
               for(String string:str){
                       System.out.print(string);
               }
        }
}
作者: 王宝康    时间: 2012-7-16 00:28
  1. class  Test
  2. {
  3.         public static void main(String[]args)
  4.         {
  5.                 char[]arr={'a','s','f','h'};
  6.                 String[]str={"123","456","789"};
  7.                 String a=String.valueOf(arr);
  8.                 String b=String.valueOf(str);//这儿调用的是String的public static String valueOf(Object obj)方法。
  9.                 System.out.println("字符:"+a);
  10.                 System.out.println("字符串:"+b);
  11.         }
  12. }
复制代码
public static String valueOf(Object obj) 返回 Object 参数的字符串表示形式。你的代码就会返回你的字符串数组的字符串表示形式,这时就会调用Object对象的toString方法,
Object 类的 toString 方法返回一个字符串,该字符串由类名(对象是该类的一个实例)、at 标记符“@”和此对象哈希码的无符号十六进制表示组成。换句话说,该方法返回一个字符串,它的值等于:

getClass().getName() + '@' + Integer.toHexString(hashCode())

[Ljava.lang.String;@119dc16
[Ljava.lang.String通过反射技术得到的要打印的对象的类型,119dc16,当前对象的哈希值的十六进制然后转换成int后的值。




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