【问题标题】:are many object instances an issue in android?许多对象实例在android中是一个问题吗?
【发布时间】:2011-02-15 20:09:11
【问题描述】:

我计划通过以下方式在 Android (3.0) 中创建 2D(地形)地图的表示

  • 一个类MapCoordinate,它只是一个“结构”,由 int 类型的公共属性 x、y 组成,表示 MapCoordinate
  • 一个类MapPoint(可能不是一个好名字),它封装了访问和更改地图中某个点的数据的方法(对于一个地图坐标)
  • 一个类Map,它有一个实例/Map(我的应用程序中只有一个),并通过HashMap封装了一个Map:

    public class Map {
        HashMap<MapCoordinate, MapPoint> mapPoint = new HashMap<MapCoordinate, MapPoint>();
    }
    

所以,我的问题是:在 Android 上拥有许多 (Java) 对象实例是否对性能至关重要(只有平板电脑是我的应用程序的目标)。当然,这张地图只是我整个应用程序的一小部分。地图可能会变得相当大。

感谢您的反馈。

【问题讨论】:

    标签: java android android-3.0-honeycomb


    【解决方案1】:

    如果可能,您可以尝试实现 Fly Weight 模式。官方文档建议避免创建对象:

    Avoid Creating Objects

    对象的创建从来都不是免费的。具有用于临时对象的每个线程分配池的分代 GC 可以使分配更便宜,但分配内存总是比不分配内存更昂贵。

    如果您在用户界面循环中分配对象,您将强制定期进行垃圾收集,从而在用户体验中产生一些“小问题”。

    因此,您应该避免创建不需要的对象实例。一些可以提供帮助的示例:

    • 从一组输入数据中提取字符串时,尝试返回原始数据的子字符串,而不是创建副本。您将创建一个新的 String 对象,但它将与数据共享 char[]。
    • 如果您有一个返回字符串的方法,并且您知道它的结果将始终附加到 StringBuffer,请更改您的签名和实现,以便该函数直接执行附加,而不是创建一个短暂的临时对象.

    一个更激进的想法是将多维数组分割成并行的单一一维数组:

    • int 数组比 Integer 数组好得多,但这也概括为这样一个事实,即两个并行的 int 数组也比 (int,int) 对象数组更有效。任何原始类型的组合也是如此。
    • 如果您需要实现一个存储 (Foo,Bar) 对象元组的容器,请记住两个并行的 Foo[] 和 Bar[] 数组通常比单个自定义 (Foo,Bar) 数组好得多对象。 (当然,例外情况是,当您设计 API 以供其他代码访问时;在这种情况下,通常最好以正确的 API 设计换取速度的小幅影响。但在您自己的内部代码中,您应该尽量做到高效。)

    一般来说,尽可能避免创建短期临时对象。创建的对象越少,垃圾收集的频率就越低,这对用户体验有直接影响。

    【讨论】:

    • 这篇文章是指避免不必要的短期临时对象,这些对象将不断被创建/GC'ed。在我看来,Hawk66 担心在长寿命的 HashMap 中有太多对象,这是一个完全不同的问题?
    • 是的,飞重模式可能部分适合。正如 dbyrne 所提到的,哈希映射应该或多或少地存在于应用程序的整个生命周期中。 NDK 我只想作为最后的手段使用。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-12-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多