【问题标题】:I have a 2D array of custom objects. Must I instantiate each in Java?我有一个自定义对象的二维数组。我必须用 Java 实例化每个吗?
【发布时间】:2012-07-02 09:44:50
【问题描述】:
    dmap = new Tile[maxW][maxH];
    for (int y = 0; y < maxH; ++y)
        for (int x = 0; x < maxW; ++x)
            dmap[x][y] = new Tile();

尽管每个Tile 只有一个int 成员,但它还是很慢。我还没有为Tile() 编写构造函数。我可以改进还是应该回到 C++?

maxWmaxH都是255,我的环境是安卓模拟器。

我认为不再是这段代码慢了。我的 Log.i() 语句从 LogCat 视图中丢失了...我在上面的初始化代码中为每个 y 添加了一个。

【问题讨论】:

  • 65k 对象的创建不应该那么慢 - 除非您继续每 10 毫秒执行一次...
  • 什么是“慢”?您是否分析了您的代码?
  • 是的,您必须初始化每个对象。怎么慢?需要多少时间?与什么相比,它很慢?
  • @mishadoff 只是方法封装。
  • 我在您的问题中添加了 android 标签。

标签: java android object multidimensional-array


【解决方案1】:

您不必用对象初始化数组。默认情况下,它将包含空值,如果您的情况可以,您可以保持这样的状态。

【讨论】:

  • 空?我来自 C++。这是否意味着 null 是无用的,或者 null 是零初始化的?抱歉,我真的需要实例化一个可用的基础对象。
  • null 因为没有任何对象可以使用。如果您更喜欢后期初始化或者您不需要所有对象(那么您可能会考虑使用稀疏数组),这可能会很有用。
【解决方案2】:

如果您希望每个数组元素都包含一个有效对象,那么是的,您需要创建一个对象以放入每个数组元素中。但是,根据您要实现的目标,可能会有所帮助的事情:

延迟初始化:您可以包装数组,并仅在需要时创建 Tile,使数组大部分填充为空值。

移动你的抽象:而不是一个 Tile 对象数组,可能有一个 TileMap 对象,包含一个 2D 整数数组(不需要构造,默认为零),并让它返回适当的 Tile给定的图块索引。

你说目前所有的 Tiles 都只包含一个 int。您是否希望具有相同 int 值的不同图块成为不同的对象?这里的大部分开销是创建新对象,而不是将其分配给数组索引。预先创建您的实例 - 或者可能使用 Tile 实例的枚举 - 将意味着不需要重复此开销。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-02-13
    • 1970-01-01
    • 1970-01-01
    • 2019-04-26
    • 1970-01-01
    • 1970-01-01
    • 2017-05-02
    • 1970-01-01
    相关资源
    最近更新 更多