最近解一个栈引用和堆引用的问题是,绕到数组上, char[]、char[][] 和 int[]、int[][] 定义后,内存默认是怎样分配的可能我说的不是很清楚,或者解释起来麻烦的,就把jvm关于这的资料发到我邮箱好([email protected])了

解决方案 »

  1.   

    顶下先。初步了解一般引用在栈,new出来的对象在堆
      

  2.   

    设计到 数据结构
    你看看数据结构吧
    很好的一般书 有java版的
      

  3.   

    答:能看JVM更好。不过你的问题,只要看任何一本JAVA书,讲两维数组的空间在内存中的布局的,就行了。楼主就清楚了。
      

  4.   

    谢谢啊,其实是这样的。int[][] a = new int[4][];
    System.out.println(a[1]);  //结果是nullchar[][] b = new char[4][];
    System.out.println(b[0]);  //这个执行时报错所以,定义数组时,整型和字符型 在内存分配上有什么差异,或者我猜错了,造成错误的是其他什么原因?
      

  5.   

    这个问题不错,期待一下。
    确实不是很明白。
    byte string int 都可以正常。唯有char不行。
    想不明白。
      

  6.   


    int[][] a = new int[4][];没有确定a的长度,你输出的a[1]是一个数组地址——a[1][0]、a[1][1]、a[1][2]等,但没有赋给数组a一个引用对象,那么a[1]则为null,你可以输出System.out.println(a[1].length);试一试,会报错
    如果确定a的长度后int[][] a = new int[4][1];再输出System.out.println(a[1]);因为把数组a初始化了,则a[1]确定了引用的地址,则输出的结果不是null,应该是a[1]的地址了。java语言可以随时声明和定义变量,不像c++一样,要先声明,再定义,java中int[][] a = new int[4][];就是为了你先声明,不确定你要定义多少个值,让用户以后随时根据自己的需求再定义。
      

  7.   

    char[][] b = new char[4][]; 没有确定b的长度,你输出的b[0]是一个字符数组——b[0][0]、b[0][1]、b[0][2]等,在你输出的时候System.out.println(****)自动将数据转成String类型来输出,将该空字符数组b[0]转成String类型输出,而且还没有引用地址,当然就会错误了。
    你可以再试试这个char[] c; System.out.println(c); 同样报错。然后你再这样试一试
    b[0]=c;System.out.println(b[0]); 也是报错。
    在没有声明c的时候——char[][] b = new char[4][]; 可以假定c存在,b[0]引用的数组就是c[],c[]没有初始化,当然报错了。
      

  8.   

    答:
    1)
    int[][] a = new int[4][];
    char[][] b=new char[4][];
    内存分配的布局是一样的.都是:
    a指向一个一维数组,元素是:a[0],a[1],a[2],a[3],它们的值都是null(因为:new 数组时会自动初始化成默认值)  
    同样:
    b指向一个一维数组,元素是:b[0],b[1],b[2],b[3],它们的值都是null(因为:new 数组时会自动初始化成默认值) 差别在于输出打印上.
    System.out.println(a[1]);  //结果是null 
    其实调用的是:public void println(Object x)方法(因为:不存在println(int[])方法),而该方法是:当x是null,打印出null而:System.out.println(b[0]);  //这个执行时报错 
    其实调用的是:public void println(char[] x)方法,该方法内部又是调用public void print(char[] x)方法,该方法明确说明:当x是null时,会抛出:NullPointerException 异常.
      

  9.   

    这个地方我看到了。而且最终根到了Writer这个类。可是最后打印的时候是调用native的,没办法在继续跟踪了。
    我还是不是很明白,为什么别的类型byte string int这些都打印null,为有char要throw nullpointexception。
    这么设计的初衷是什么?或者说是基于什么考虑的??
      

  10.   

    String s1=new String("abc");
       栈            |  堆
       s1   ---->    |  "abc"
    =======================================
    String[] s2=new String[]{new String("ab"),new String("cd"),new String("ef")};
      栈   |    堆1     | 堆2
      s2   |s2[0]-----> |  "ab"
           |s2[1]-----> |  "cd"
           |s2[2]-----> |  "ef"注:s1,s2,s2[0],s2[1],s2[2]都是地址。其余情况LZ自推。
      

  11.   

      记住引用放在栈里 实例放在堆里
    int[][] a = new int[4][]; 
    char[][] b=new char[4][]; 
    内存分配的布局是一样的.都是: 
    a指向一个一维数组,元素是:a[0],a[1],a[2],a[3],它们的值都是null(因为:new 数组时会自动初始化成默认值)  
    同样: 
    b指向一个一维数组,元素是:b[0],b[1],b[2],b[3],它们的值都是null(因为:new 数组时会自动初始化成默认值) 差别在于输出打印上. 
    System.out.println(a[1]);  //结果是null 
    其实调用的是:public void println(Object x)方法(因为:不存在println(int[])方法),而该方法是:当x是null,打印出null 而:System.out.println(b[0]);  //这个执行时报错 
    其实调用的是:public void println(char[] x)方法,该方法内部又是调用public void print(char[] x)方法,该方法明确说明:当x是null时,会抛出:NullPointerException 异常-----又学习到了一些东西  顶了啊
      

  12.   

    在java中数组和其它对象引用一样,也是引用变量,存储的是一个数组的地址。所以new String[5]才是分配了数组空间
      

  13.   

    13楼牛
    能说明下jvm为什么对char和其他的类型区分开来,sun这样做的初衷是什么?