黑马程序员技术交流社区

标题: 数组 string的问题 [打印本页]

作者: 林康春    时间: 2012-6-27 21:38
标题: 数组 string的问题
本帖最后由 林康春 于 2012-6-28 23:28 编辑

class heimaStringDemo
{
        public static void main(String[] args)
        {
                method_transform();
        }
        public static void method_transform()
        {
               
                //将字符串转换成字符数组
                String s3="fdsfdsf";
                sop(s3.toCharArray());
        }
        public static void sop(Object obj)
        {
         System.out.println(obj);
        }
}
/*
结果:
[C@de6ced
这是什么东西?

*/


作者: 吴琼    时间: 2012-6-27 21:47
class heimaStringDemo
{
        public static void main(String[] args)
        {
                method_transform();
        }
        public static void method_transform()
        {
               
                //将字符串转换成字符数组
                String s3="fdsfdsf";
                sop(s3.toCharArray());//这是你写的一个方法,传给这个方法的是个字符数组.
        }
        public static void sop(Object obj)
        {
         //如果你想打印这个字符数组的话就对这个字符数组进行遍历就可以了.
         System.out.println(obj);//这里你直接打印一个数组,就是打印这个数组的首地址.
        }
}
/*
结果:
[C@de6ced   [表示这是以个数组C表示数组的类型是Char@是个固定的模式de6ced 十六进制表示的是堆内存中的地址
这是什么东西?

*/

作者: 贾飞雨    时间: 2012-6-27 21:50
这个是哈希值,也就是数组的堆内存地址值,你这样输出肯定是这样的,s3.toCharArray()这个是把字符串转换成char类型的数组,打印数组当然会是这样的,这个是数组的首地址值,
作者: 常佳杰    时间: 2012-6-27 23:32
[C@de6ced   [表示数组     C表示数组类型是Char     @是个固定的模式    de6ced表示十六进制表示的是堆内存中的地址
哥们你是要打印数组吧..
要是想打印这样写
class heimaStringDemo
{
        public static void main(String[] args)
        {
                method_transform();
        }
        public static void method_transform()
        {            
                //将字符串转换成字符数组
                String s3="fdsfdsf";
                sop(s3.toCharArray());
        }
        public static void sop(Object obj)
        {
                Iterator it  = obj.iterator();
                 while(it.hasnext()){
                 System.out.print(it.next());
                 }
        }
}
死锁是这样一种情形:多个线程同时被阻塞,它们中的一个或者全部都在等待某个资源被释放。由于线程被无限期地阻塞,因此程序不可能正常终止...
作者: 吴扬    时间: 2012-6-27 23:38
s3.toCharArray()这句将字符串类型的变量s3转换成了一个字符数组,由于数组在内存中是引用型数据,所以你打印出来的是这个数组在内存中的首地址值
如果你想打印出这个字符数组中的元素,应该是用for循环的方式遍历该数组中的元素,代码如下:
String s3="fdsfdsf";
char[] charArray = s3.toCharArray();
for(int i = 0; i < charArray.length; i++)
{
    sop(charArray[i]);
}
作者: 李文龙    时间: 2012-6-27 23:40
[C@de6ced这是数组在内存中的首地址  举个例子吧,int a[]={1,2,3,4,5};你要是System.out.println(+a),那输出的就是数组a在内存中的地址,你要想得到每个单独的值,需要使用for循环,一个个输出,同理,你这里将String类型的数据转换成字符数组,本质上和int类型的数组是没区别的,所以你的输出就是[C@de6ced
作者: sbeeqnui1987    时间: 2012-6-28 00:15
因为System.out.println(obj);
此时调用了+操作,而obj是个数组对象,就调用了a的toString()方法,输出了该对象的地址

而System.out.println(obj);
则是调用了System.out.println(char[] x)这个重载的方法,会把你char数组的每个内容打出来


作者: 谭立文    时间: 2012-6-28 00:29
class Test
{
        public static void main(String[] args)
        {
                method_transform();
        }
        public static void method_transform()
        {
               
                //将字符串转换成字符数组
                String s3= "fdsfdsf";
                char[] charArray = s3.toCharArray();
                sop(charArray);
        }
        public static void sop(Object obj)
        {
                //此时Obj接受的是一个char[] 型对象
          System.out.println(obj);
          //所以输出的是[C  //代表char型数组
          //@后面的是char[]对象在内存中的地址
        }
}

作者: 周朋飞    时间: 2012-6-28 02:29
打印出来的肯定是一个对象吗 ,你都用参数object当形参了,那传进去的肯定是Object类型的了,但为什么打印出这一串,当你的对象时一个数组类的时候,则名字的内部形式是该数组嵌套深度的一个或多个 '[' 字符加元素类型名,你传进来的是char数组,并且是一维数组,所以有一个【符号,如果是二维的话,就会使[[后边C代表的是char 后边的是hashcode的值 其实你转换成十进制之后就是你在编译器当中 打印输出语句的效果  
你还是自己试一下吧 我教你一个方法:char [] a1 = new char[3];  
System.out.println(a1);  
System.out.println(a1.hashCode());
然后你将得出的hashcode转换成十六进制之后看看是不是跟你@ 之后的相同 你就理解

作者: 周朋飞    时间: 2012-6-28 02:29
打印出来的肯定是一个对象吗 ,你都用参数object当形参了,那传进去的肯定是Object类型的了,但为什么打印出这一串,当你的对象时一个数组类的时候,则名字的内部形式是该数组嵌套深度的一个或多个 '[' 字符加元素类型名,你传进来的是char数组,并且是一维数组,所以有一个【符号,如果是二维的话,就会使[[后边C代表的是char 后边的是hashcode的值 其实你转换成十进制之后就是你在编译器当中 打印输出语句的效果  
你还是自己试一下吧 我教你一个方法:char [] a1 = new char[3];  
System.out.println(a1);  
System.out.println(a1.hashCode());
然后你将得出的hashcode转换成十六进制之后看看是不是跟你@ 之后的相同 你就理解

作者: 周朋飞    时间: 2012-6-28 02:29
打印出来的肯定是一个对象吗 ,你都用参数object当形参了,那传进去的肯定是Object类型的了,但为什么打印出这一串,当你的对象时一个数组类的时候,则名字的内部形式是该数组嵌套深度的一个或多个 '[' 字符加元素类型名,你传进来的是char数组,并且是一维数组,所以有一个【符号,如果是二维的话,就会使[[后边C代表的是char 后边的是hashcode的值 其实你转换成十进制之后就是你在编译器当中 打印输出语句的效果  
你还是自己试一下吧 我教你一个方法:char [] a1 = new char[3];  
System.out.println(a1);  
System.out.println(a1.hashCode());
然后你将得出的hashcode转换成十六进制之后看看是不是跟你@ 之后的相同 你就理解

作者: 刘蕴学    时间: 2012-6-28 19:43
周朋飞 发表于 2012-6-28 02:29
打印出来的肯定是一个对象吗 ,你都用参数object当形参了,那传进去的肯定是Object类型的了,但为什么打印 ...

你也可以自己试试这个代码输出的是什么,呵呵
  1. public static void main(String[] args) {
  2.                
  3.                 char [] a1 = new char[]{'c','b','a'};  
  4.                 System.out.println(a1);  
  5.                 System.out.println(a1.hashCode());
  6.         }
复制代码

作者: 常佳杰    时间: 2012-6-28 19:47
常佳杰 发表于 2012-6-27 23:32
[C@de6ced   [表示数组     C表示数组类型是Char     @是个固定的模式    de6ced表示十六进制表示的是堆内 ...

没看到,我在桌面建立的文本文档,回答时先做个草稿,那会答两个题有点糊:dizzy:弄错了.. 唉.可能那个题没答上答到这里了...请老师谅解哈 :L
作者: 田向向    时间: 2012-6-28 20:26
你没看比老师的那个视频吗?你把数组实体的引用直接打印了。[代表数组类型的引用,C代表里面存放的是char类型的数据,de6ced是用哈希算法算出来的16进制的哈希值 ,是数组在内存中存放的地址,比老师视频  黑马程序员_毕向东_Java基础视频教程第04天-02-数组(常见操作-遍历)
作者: 周朋飞    时间: 2012-6-28 22:26
刘蕴学 发表于 2012-6-28 19:43
你也可以自己试试这个代码输出的是什么,呵呵

呵呵 不好意思 我有点想当然了 因为我用整数试出来是好使的 ,谢谢提醒  不过整型是好使的 呵呵
作者: 周朋飞    时间: 2012-6-28 22:26
刘蕴学 发表于 2012-6-28 19:43
你也可以自己试试这个代码输出的是什么,呵呵

呵呵 不好意思 我有点想当然了 因为我用整数试出来是好使的 ,谢谢提醒  不过整型是好使的 呵呵
作者: 周朋飞    时间: 2012-6-28 22:28
我稍微修改了一下 楼主 看一下 不好意思啊 那时候我有些想当然了

            char [] a1 = new char[]{'c','b','a'};  

            System.out.println((Object)a1);  

            System.out.println(a1.hashCode());
作者: 游洪波    时间: 2012-6-28 22:40
class heimaStringDemo
{
        public static void main(String[] args)
        {
                method_transform();
        }
        public static void method_transform()
        {
               
                //将字符串转换成字符数组
                String s3="fdsfdsf";
                sop(s3.toCharArray());//你在这里把String转换成了一个数组传送到sop方法中去
        }
        public static void sop(Object obj)//你这里却接受了一个object对象所以你下边是不会得到你想要的的结果的
        {
        //在这里如果你还想把字符串输出的话,有两种办法一就是把object强转回String 然后再输出,第二就是在接受参数的地方你可以使用char[] 类型的数据接受
         //接受完以后在这里进行遍历逐个输出就好了

/*
       for(int i=0;i<数组长度;i++){
             System.out.println(数组名);
     }
*/
         System.out.println(obj);//至于你这里输出的是一个object对象,而结果是对象在内存中的引用地址,你要知道每一个对象的开辟都会在内存中有一个固定的位置,而用来获取这些对象就必须要有一个地址去指向它才可以使用,而每个对象默认的toString()方法都是输出这个对象的内存地址。C@de6ced 的后六位就表示你这个Object对象在内存中的十六进制地址,而第一位则表示,存放的数据类型。
        }
}

作者: 林康春    时间: 2012-6-28 23:27
刚回来,明白了, 原来是我打印的是数组的地址
谢谢各位
我会继续努力的

作者: 游洪波    时间: 2012-6-28 23:36
游洪波 发表于 2012-6-28 22:40
class heimaStringDemo
{
        public static void main(String[] args)

我改了一下,可以通过
char数组名.toString().这样打印出来就是类似字符串的方式了
还有一种是数组名的hashcode()方法也可以。
对吧版主!




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