java - Android内存使用和对象引用

标签 java android object memory-management reference

我确信这个问题(或类似的问题)已经在其他地方被问过,但我找不到它,所以这是我的 Android 应用程序的(稍微简化的)流程:

Activity A: 解析 json 文件并将结果对象存储在列表中(我们称之为“原始”)。完成后,运行 Activity B。

Activity B: 搜索屏幕。单击按钮运行 Activity C

Activity C: 根据 Activity B 中的搜索参数过滤 Activity A 中创建的列表。将过滤后的对象添加到另一个列表(用于 Activity D - 让我们称之为“过滤”),并根据它们的值创建另一个对象(用于 Activity E 中) - 我们称之为bigObj)。为了防止 bigObj 的创建方式相关,假设我从这样的对象开始:

filtered = [{"name":"Dave", "age":"32", "job":"boss"},
{"name":"Dave", "age":"32", "job":"worker"},
{"name":"Dave", "age":"24", "job":"boss"},
{"name":"James", "age":"26", "job":"boss"},
{"name":"James", "age":"26", "job":"boss"},
{"name":"James", "age":"65", "job":"boss"}]

然后我最终得到一个像这样的对象:

   bigObj = {"Dave":{"32":[{"name":"Dave", "age":"32", "job":"boss"},
                {"name":"Dave", "age":"32", "job":"worker"}],
        "24":[{"name":"Dave", "age":"24", "job":"boss"}]
            },
        "James":{"26":[{"name":"James", "age":"26", "job":"boss"},
                {"name":"James", "age":"26", "job":"boss"}],
        "65":[{"name":"James", "age":"65", "job":"boss"}]
            }
}

所有这三个都通过应用程序 Activity 的 setter 保存。

稍后,根据 Activity D 或 E 中的用户交互,较小对象的内容 - 例如 {"name":"Dave", "age":"32", "job": "boss"} - 在 Activity F 中向用户显示。

一切正常。但有明显的重复。如果某个对象通过了过滤器,它就会出现在所有 3 个位置。由于对象包含的信息比 Activity D 或 E 中实际需要的信息多得多,因此似乎有大量数据被不必要地传递。这引出了我的问题:

假设“raw”中有 100 个对象,其中 50 个通过了过滤器。现在内存中有 150 个对象,还是放入“过滤”的 50 个对象只是对原始对象的引用?

因为另一种方法(看起来)只是简单地使用“filtered”来存储对象在“raw”中出现的索引(并从“raw”中动态检索实际对象) Activity D),然后,在创建“bigObj”时创建新的“迷你对象”,其中仅包含 Activity E 所需的信息 - 从上面的示例中,名称和年龄值,加上对象在“原始”中的位置,然后可以用于检索 Activity F 中的对象。

但是,如果对象只是通过引用存储在“filtered”和“bigObj”中,那么制作一整套“迷你对象”实际上会适得其反,最终会占用内存而不是保存它。

感谢您的任何想法。我怀疑这个问题可以问得更简单,但我还不够了解什么是相关的,什么是不相关的......

最佳答案

---Android部分开始---
单个应用程序中的所有 Activity 共享相同的虚拟内存。这意味着任何 Activity 的任何数据都可以不受任何限制地供任何其他 Activity 使用。
---Android部分完---

Java 不将对象保存在变量中。 Java 中的对象变量类似于 C++ 中的对象变量 - 它是指向包含对象数据的内存的指针。

在 Java 中,方法的参数仅按值传递。这意味着任何原始变量都将被复制,并且副本将被传递给方法。但对象变量不是原始类型变量,因此方法将获得对象引用的副本,这意味着实际的对象数据永远不会被复制,直到您自己将其复制到新创建的对象。

Variables (The Java Tutorials > Learning the Java Language > Language Basics)

关于java - Android内存使用和对象引用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21813231/

相关文章:

Java 获取 .wav 文件在 .jar 中运行

java - java中的mongodb嵌套搜索查询

android - 在firebase数据库中添加新数据后如何获取所有数据

c# - 为什么我们必须使用对象来访问类成员?

javascript - 在 Javascript 中向对象原型(prototype)添加许多函数时出现性能问题?

Java 8 stream groupBy pojo

java.net.SocketException : Broken pipe while accessing mysql on cloud server

android - 以编程方式将图像附加到消息应用程序

android - (设计支持库)状态栏后面的工具栏项

c++ - 如何防止其他人在堆栈上创建您的类的新实例?