Array的内存初始化背后的概念是什么?

时间:2012-04-27 03:54:00

标签: java arrays

String a[]=null;
    if(a[0]!=null)
    {
        System.err.println("dd-1");
    }

    if(a!=null)
        {
        System.err.println("dd-2");
        }
    }

首先如果condtion它抛出空指针异常,但在第二条件条件下它不会抛出空指针异常?任何人都可以解释我一样吗?在堆内存分配上有没有任何概念。

我也知道因缺少内存分配而导致的问题,字符串a [] =新字符串。[10];请透露这个概念吗?

5 个答案:

答案 0 :(得分:2)

在第一个if条件中,您尝试访问数组中的第一个元素,甚至认为没有为它完成分配。

在第二种情况下,您只是测试参考。

(把它想象成C指针,char * str = NULL除了指针指向NULL之外没有分配任何东西)

String a[]=null;

没有为数组分配内存,只创建了引用。

String a[] = new String[1]

在堆上创建一个容纳一个String对象的内存,并且a指向分配的字符串对象。

答案 1 :(得分:1)

 if(a[0]!=null)

第一个条件是尝试访问数组的第一个元素(并检查它是否存在)。如果数组不存在(即为空),那将无效。

 if(a!=null)

第二个条件是检查数组本身是否为空。

创建数组时,会在阵列上分配(在堆上)数组的内存。那时你还必须指定它的大小(这将确定分配多少内存)。内存也使用null初始化,因此您不会获得新数组的垃圾数据。

对数组元素的访问不仅仅是在C中的指针算术,Java实际上会检查数组是否存在以及索引是否在其范围内。

答案 2 :(得分:0)

在Java中,数组不像C,它们是生活在堆中的对象,它们有一种特殊的类型和语法来访问它们的元素但是它们是对象,如果你想访问你需要做的任何子索引

之类的东西
String[] a = new String[10];

之后,每个元素将初始化为null,0或false,具体取决于数组的类型。

答案 3 :(得分:0)

数组是对象。你必须为他们创造新的空间。如果您尝试访问空引用,则每次都会获得NullPointerException

答案 4 :(得分:0)

如果使用a[0],则将访问对象(数组的第一个对象)。但是a还没有任何对象。因此,第一个抛出异常。但在第二个中,您正在检查参考。它不是一个对象。所以a等于NULL。