黑马程序员技术交流社区

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

作者: 杨洋    时间: 2012-8-2 14:40
标题: 数组问题
public class Example
{
String str = new String("good");
char[] ch = {'a','b','c'};
public static void main(String args[])
{
  Example ex = new Example();
  ex.change(ex.str,ex.ch);
  System.out.println(ex.str+";;;;"+ex.ch);      //结果是:good;;;;[C@110003
  System.out.println(ex.ch);                           //结果是:gbc
}
public void change(String str,char ch[])
{
  str="test ok";
  ch[0]='g';
}
}

为什么两个结果不一样?
作者: 李东升    时间: 2012-8-2 15:12
本帖最后由 李东升 于 2012-8-2 15:21 编辑

你从输出结果可以看出,第一个输出的是字符数组的地址,第二个是内容。
你把代码改成如下,会看到两个输出的都是地址,。
  1. public class Example
  2. {
  3. String str = new String("good");
  4. char[] ch = {'a','b','c'};
  5. public static void main(String args[])
  6. {
  7.   Example ex = new Example();
  8.   ex.change(ex.str,ex.ch);
  9.   System.out.println(ex.str+";;;;"+ex.ch);      //结果是:good;;;;[C@110003
  10.   System.out.println(ex.ch+"");                           //结果是:;;;;[C@110003
  11.   }
  12. public void change(String str,char ch[])
  13. {
  14.   str="test ok";
  15.   ch[0]='g';
  16. }
  17. }

复制代码
这是因为你在输出数组加上""的话,就会跟调用了toString()方法一样,数组调用toString()方法输出的就是地址了、
作者: 尤洋    时间: 2012-8-2 16:23
其实直接根据两个的不同点就能看出来,一个直接输出,一个是加上了字符串后输出,
而任何数据类型加上字符串都会 转化成字符串。
基本数据类型如 1+"a"后会得出 “b” ASCII值。
引用数据类型如 数组+“”后会得到 哈希码值。
作者: 黑马黄宏强    时间: 2012-8-2 16:36
本帖最后由 轻尘一笑 于 2012-8-2 16:41 编辑

事情是这样的:
public void change(String str,char ch[])
{
  str="test ok";
  ch[0]='g';
}
这方法进栈
会新生成一个 String类型的变量 str 然后就接收实参数对象引用,再然后指向堆中的新对象test ok方法执行完毕 str释放,原来的对象并未被改变
而char ch[] 接受了一个对象的引用,然后操作该对象将下标为0的元素赋值为'g' 方法执行完毕 ch变量释放,原来对象已经被改变
执行ex.change(ex.str,ex.ch);
str的值没变,而数组的第0个位置已经变成g
所以:
System.out.println(ex.str+";;;;"+ex.ch); //结果是:good;;;;[C@110003      ex.ch因为有跟字符串相连所以是toString返回值
System.out.println(ex.ch);                      //结果是:gbc                                 ex.ch在这里使用的是public void println(char[] x)所以打印出来的是元素值

public void println(char[] x)原码如下:
    public void println(char x[]) {
        synchronized (this) {
            print(x);
            newLine();
        }
    }
作者: 杨洋    时间: 2012-8-2 17:36
谢谢,已解决
作者: 杨洋    时间: 2012-8-2 17:39
问题已经解决
作者: hello world    时间: 2012-8-2 17:41
[img]D:\[内存分析.bmp这个分析图可以很好的解决你的问题了。
作者: hello world    时间: 2012-8-2 17:49
这个能很好的解释了

内存分析.png (807.48 KB, 下载次数: 58)

内存分析.png





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