Java noob问题:
考虑以下C数组和初始化代码:
struct {
int x;
int y;
} point_t;
point_t points[1000];
易。这会在加载时创建并分配内存。
现在考虑Java中的类似内容:
public class point_t
{
public int x;
public int y;
}
point_t points[] = new point_t[1000];
// Without this loop, java will crash when you run this
for (int i=0; i<1000; i++)
{
points[i] = new point_t;
}
points[0].x = 10; // Crash would occur here without above loop
points[1].x = 10;
最初我的java程序崩溃了一个空指针取消引用。问题是,来自C ++,我不知道你必须创建1000个point_t对象。只是一个评论,但这似乎是INSANE。假设阵列大小为100万或10亿。它只需几秒钟即可创建&#34;此数组在运行时具有空条目。在C ++中,它都发生在加载时。我承认你并不总是知道C ++阵列的单元格中会有什么,但在我工作的嵌入式系统中,内存通常被自动初始化为零,因此它可以工作。
当你有一个对象数组时,Java中有没有更简单,更快捷,更有效的方法来创建数组并分配内存?或者我在上面的代码中做错了什么?
答案 0 :(得分:7)
由于您来自C ++背景,这可能有所帮助。在Java中,当你写
point_t points[] = new point_t[1000];
这类似于用C ++写作
point_t* points[] = new point_t*[1000];
也就是说,在Java中,当您创建数组时,您不是创建点对象数组,而是创建点引用数组,就像在C ++中创建点指针数组一样。 / p>
Java是一种托管(垃圾收集)语言;这就是Java程序员所期望的。
至于问题的第二部分,如何自己创建对象,你做的很好。在循环中创建1000个点对象并加载它们。如果你想要更短的代码,你可以编写一个很好的方法来完成这项工作。 :)
您还可以查看可能拥有这些便利工厂方法的其他集合库。
答案 1 :(得分:4)
书写
point_t[] points = new point_t[ 1000 ];
正在为point_t对象分配一千个引用。 (用C语言来说,它正在分配指向该类型结构的指针。)
那个循环
for (int i=0; i<1000; i++)
{
points[i] = new point_t;
}
分配一个新的point_t对象,并将引用(指针)放在数组中。直到你这样做,数组只是空值,它可能给你空例外。
答案 2 :(得分:2)
那不是point_t
个实例的数组;那些活在堆里。
它实际上是对堆上的point_t
个实例的引用数组。
任何未通过分配给参考值而初始化的引用(例如通过调用new)都设置为null。
对于非数组引用类型也是如此。
public class Person {
private String name; // not initialized; that means it's null
public Person() {} // oops; constructor should have initialized name, but now it's null
public String getName() { return name; } // returns null unless you set it properly
public void setName(String newName) { this.name = newName; }
}
答案 3 :(得分:1)
您可以使用Flyweight pattern在不同对象之间共享相同的数据,并推迟创建点对象,直到确实需要为止