Java android内存使用和对象引用
我确信这个问题(或类似的问题)已经在别处被问过了,但我找不到它,所以这是我的android应用程序的流程(稍微简化): 活动A: 解析json文件并将结果对象存储在列表中(我们称之为“raw”)。完成后,运行Activty B 活动B: 搜索屏幕。单击按钮运行活动C 活动C: 根据活动B中的搜索参数筛选活动A中的列表。将筛选出的对象添加到另一个列表中(用于活动D-我们称之为“筛选”),并根据其值创建另一个对象(用于活动E-我们称之为bigObj)。以防bigObj的创建方式与此相关,假设我从如下对象开始:Java android内存使用和对象引用,java,android,object,memory-management,reference,Java,Android,Object,Memory Management,Reference,我确信这个问题(或类似的问题)已经在别处被问过了,但我找不到它,所以这是我的android应用程序的流程(稍微简化): 活动A: 解析json文件并将结果对象存储在列表中(我们称之为“raw”)。完成后,运行Activty B 活动B: 搜索屏幕。单击按钮运行活动C 活动C: 根据活动B中的搜索参数筛选活动A中的列表。将筛选出的对象添加到另一个列表中(用于活动D-我们称之为“筛选”),并根据其值创建另一个对象(用于活动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"}]
}
}
然后我得到了这样一个物体:
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"}]
}
}
所有这三个都是通过应用程序活动上的setter保存的
稍后,根据活动D或E中的用户交互,较小对象的内容(例如{“name”:“Dave”、“age”:“32”、“job”:“boss”}
)将在活动F中显示给用户
这一切都很好。但有明显的重复。如果某个对象通过过滤器,它将显示在所有3个位置。由于对象包含的信息比活动D或E中实际需要的信息多得多,因此似乎有很多数据被不必要地传递。这就引出了我的问题:
假设“raw”中有100个对象,50个对象通过过滤器。内存中现在有150个对象,还是50个被放入“过滤”的对象只是对原始对象的引用
因为另一种方法(看起来)是简单地使用“过滤”来存储对象在“原始”中出现的索引(并从活动D中的“原始”动态检索实际对象),然后在生成“bigObj”时生成新的“迷你对象”它只包含活动E所需的信息—从上面的示例中可以看到名称和年龄值,以及对象在“原始”中的位置,然后可以使用该位置在活动F中检索对象
但是,如果对象只是通过引用存储在“filtered”和“bigObj”中,那么制作一整套“mini objects”实际上会适得其反,最终会吞噬内存而不是保存它
谢谢你的想法。我怀疑这个问题可以问得更简单一些,但我不知道什么是相关的,什么是不相关的 ——Android部分开始--单个应用程序中的所有活动共享相同的虚拟内存。这意味着来自任何活动的任何数据都可以不受任何限制地用于任何其他活动。
---安卓部分结束--- Java不将对象保存在变量中。java中的对象变量类似C++中的对象变量——它是指向包含对象数据的内存指针。 在Java中,只通过值传递的方法的参数。这意味着任何原语变量都将被复制,复制将被传递给方法。但对象变量不是基元类型变量,所以方法将获得对对象引用的副本,这意味着在您将实际对象数据复制到新创建的对象之前,永远不会复制它
具体实施。但是,如果使用原始列表中的引用,则只会存在100个。如果您通过new关键字创建新副本,那么您将有150个副本。请记住,无论您如何创建,Java中的所有内容都是按值传递的。我的意思是,如果您传递一个对象,您将传递其引用的副本(严格地说,是副本的副本)。在类A中创建的objectA及其传递给类B的引用将是同一个对象引用<代码>=将评估为
真的
。谢谢,盖布和西蒙。这就是我所希望的。谢谢,瓦伦丁。后来我也找到了一个很好的解释