4

Java菜鸟问题:

考虑以下 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 对象。只是一个评论,但这似乎很疯狂。假设数组大小为 100 万或 10 亿。在运行时用空条目“创建”这个数组实际上需要几秒钟。在 C++ 中,这一切都发生在加载时。我承认你并不总是知道 C++ 数组的单元格中会有什么,但在我工作的嵌入式系统中,内存通常会自动初始化为零,因此它可以工作。

那么,当你有一个对象数组时,在 Java 中有没有更简单、更快、更有效的方法来创建一个数组并分配内存呢?或者我在上面的代码中做错了什么?

4

4 回答 4

7

由于您来自 C++ 背景,这可能会有所帮助。在 Java 中,当你编写

point_t points[] = new point_t[1000];

这类似于用 C++ 编写,

point_t* points[] = new point_t*[1000];

也就是说,在 Java 中,当您创建数组时,您创建的不是点对象数组,而是点引用数组,就像您在 C++ 中创建点指针数组一样。

Java 是一种托管(垃圾收集)语言;这就是 Java 程序员所期望的。

至于您问题的第二部分,如何自己创建对象,您所做的很好。在循环中创建 1000 个点对象并加载它们。如果你想要更短的代码,你可以编写一个很好的方法来完成这项工作。:)

您还可以查看其他可能具有此类便利工厂方法的集合库。

于 2012-06-16T01:25:27.530 回答
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 对象,并将指向它的引用(指针)放入数组中。在你这样做之前,数组只是空值,它可能会给你空异常。

于 2012-06-16T01:26:33.577 回答
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; }
}
于 2012-06-16T01:31:22.047 回答
1

您可以使用 享元模式在不同对象之间共享相同的数据,并将点对象的创建推迟到真正需要时

于 2012-06-16T02:55:51.397 回答