创建后数组大小更改

时间:2011-12-13 22:41:51

标签: java arrays

任何人都可以解释这里发生的事情。我的印象是数组的大小一旦创建并声明就无法更改。

public class ArrayManipulation 
{
    public static void main(String[] args) 
    {
        int a[] = {1, 2, 3};//new int[3];
        int b[] = new int[a.length-1];

        System.out.print("a = ");
        for (int i = 0; i < a.length; i++)
            System.out.print(a[i] + "  ");
        System.out.println();

        for (int i = 0; i < b.length; i++)
            b[i] = a[i];
        //This is the bit I am confused about.. I was expecting an error here
        a = b;

        System.out.print("a = ");
        for (int i = 0; i < a.length; i++)
           System.out.print(a[i] + "  ");
        System.out.println();       
    }
}

4 个答案:

答案 0 :(得分:6)

数组是对象,是的,一旦它们被创建,它们的大小就不会改变。

在该行:

a= b;

您指向a对象b的引用。因此,a引用的初始对象仍然在VM中,直到它被垃圾收集。

但是你的数组大小没有改变,但你引用的是指向一个不同的数组/对象

答案 1 :(得分:0)

ab都属于int[]类型。因此a = b只需将a的值指定为b的值。

在此分配之后,ab都引用相同的数组,垃圾收集器可以收集a引用的初始数组它不能再被访问了。

答案 2 :(得分:0)

当您说a时,您正在更改a = b指向的引用。

由于数组是对象,因此设置一个等于另一个会更改引用。两个数组仍然存在,但两个引用 - ab - 都指向b的位置。实际删除数组a的唯一方法是垃圾收集它。

你实际上并没有改变数组大小,它就像是它。

答案 3 :(得分:0)

    //This is the bit I am confused about.. I was expecting an error here
    a = b;
是的,你对正确的事感到困惑! ab为自己分配了自己的内存。使用a = b,您a指向为b分配的内存。

将这些额外的sysout添加到代码中会有所帮助,请参阅输出:

public class ArrayManipulation 
{
    public static void main(String[] args) 
    {
        int a[] = {1, 2, 3};//new int[3];
        int b[] = new int[a.length-1];


        System.out.print("a = ");
        for (int i = 0; i < a.length; i++)
            System.out.print(a[i] + "  ");
        System.out.println();

        for (int i = 0; i < b.length; i++)
            b[i] = a[i];

        System.out.print("NEW -- before a=b. a = " + a);
        System.out.print("NEW -- before a=b. b = " + b);
        //This is the bit I am confused about.. I was expecting an error here
        a = b;
        System.out.print("NEW -- after a=b. a = " + a);
        System.out.print("NEW -- after a=b. b = " + b);

        System.out.print("a = ");
        for (int i = 0; i < a.length; i++)
           System.out.print(a[i] + "  ");
        System.out.println();       
    }
}