Java如何在内存中分配对象的属性?

时间:2018-08-13 14:46:19

标签: java android-studio

我有一个代表一组属性的类,但是在对其进行序列化时,我注意到这些属性是按字母顺序重新排列的。经调查,这是因为属性是如何保存在内存中的。

类声明:

enter image description here

在完成序列化之前,内存中的对象:

enter image description here

这是Debug中运行的android studio的“功能”,还是其他情况?

2 个答案:

答案 0 :(得分:3)

Android Studio / IntelliJ具有一些用于配置调试器如何显示数据的选项。 the docs for Variables pane中对此进行了描述。排序由Sort Values Alphabetically option in the Debug Tool Window控制。

这纯粹是装饰性的,与内存中的实际对象布局无关。 Java随附了JOL工具,但我不确定它是否可以在Android中使用:

  

JOL(Java对象布局)是用于分析JVM中对象布局方案的微型工具箱。这些工具大量使用Unsafe,JVMTI和Serviceability Agent(SA)来解码实际的对象布局,覆盖区和引用。这使JOL比依赖堆转储,规范假设等的其他工具更加准确。

答案 1 :(得分:1)

正如其他人指出的那样,IDEA中的调试变量视图并不直接反映内存布局;这只是IntelliJ做出的GUI选择。通常,您不应该考虑具有任何顺序的变量。将它们放在源代码中的顺序无关紧要。

由于字段没有顺序,并且由于JSON规范还指出字段未排序,因此GSON可以自由选择序列化的顺序。 IntelliJ(用于GUI)和GSON(用于序列化)都选择了字母顺序,因为这是最易于使用的。

如果您在JSON中必须具有不同的顺序(可能是因为您的数据被违反特定顺序的JSON规范的软件所占用),请参见this answer