变量内存分配如何工作?

时间:2017-11-08 17:56:28

标签: java android variables memory out-of-memory

当我为String builder创建新对象并使用该变量时,内存分配如何工作以及我的示例代码的结果是什么?

1)

String nextPoint=new StringBuilder().append("My").append("next").append("point").toString();

System.out.println(nextPoint);

2)

StringBuilder downPoint=new StringBuilder().append("My").append("next").append("point");

System.out.println(downPoint.toString());

哪些变量/实例可以消耗内存?当我使用" nextPoint"可变或" downPoint"变量?

2 个答案:

答案 0 :(得分:1)

  

哪些变量/实例可以消耗内存?

每个班级占用记忆。多少取决于课程。每个对象占用堆内存。多少取决于它的等级。许多类和对象也包含对其他对象的引用,而其他对象占用它们自己的堆内存。某些对象还具有关联的本机资源,这些资源占用了特殊的内存量。局部变量占用适合其类型的堆栈内存,但在某些情况下,某些局部变量可能与其他变量共享相同的堆栈内存。

在你的情况下(1):

if (grid[i][SIZE - 1 - i] != 0)
{
    count[2 * SIZE + 1]++;
}

变量String nextPoint=new StringBuilder().append("My").append("next").append("point").toString(); System.out.println(nextPoint); 是一个本地引用变量,消耗堆栈内存(用于引用,而不是整个nextPoint)。它通过创建一个新的String对象(在堆上)并向其附加三个字符串(每个字符串占用堆内存),然后创建一个新的StringBuilder对象(也占用堆内存)来初始化),并在String中存储对它的引用。 nextPoint将为累积的字符数据提供某种相关的存储空间;这不会与所涉及的任何字符串重叠。

您的情况(2)的不同之处仅在于保留了对StringBuilder的引用,而不是对生成的StringBuilder的引用。这可能会对后面的代码产生影响,但对于创建哪些对象和需要什么内存没有区别。

  

当我使用“nextPoint”变量或“downPoint”变量时,哪种解决方案更好?

这取决于你之后想做什么。如果你不打算再使用这些变量中的任何一个,那么差异就是纯粹的风格。

  

我的代码段的结果是什么[?]

把它放在课堂上,运行它,然后自己找出来。或者从代码中弄清楚。这个不是你需要我们为你回答的。

答案 1 :(得分:0)

两个片段都执行相同的方法调用序列,即

new StringBuilder().append("My").append("next").append("point").toString()

所以他们的内存使用量(大部分)是相同的。只有片段(1)在变量中存储对StringBuilder的引用,(2)存储生成的String引用。但是由于引用的大小相同,无论引用什么,都会导致占用相同的字节数。