可变内存分配如何工作?

How does variable memory allocation work?

当我为字符串生成器创建新对象并使用该变量时,内存分配如何工作以及我的代码片段的结果是什么,我的示例代码是

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());

哪个variables/instance会耗内存??当我使用 "nextPoint" 变量或 "downPoint" 变量时,哪个解决方案更好?

Which variables/instance can consume memory?

每个class占用内存。多少取决于class。每个对象都占用堆内存。多少取决于它的class。许多 classes 和对象还包含对其他对象的引用,而那些其他对象占用自己的堆内存。一些对象还具有关联的本机资源,这些资源占用特殊数量的内存。局部变量占用适合其类型的堆栈内存,但在某些情况下某些局部变量可能与其他变量共享相同的堆栈内存。

你的情况 (1):

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

System.out.println(nextPoint);

变量nextPoint是一个局部引用变量,占用栈内存(只供引用,不是整个String)。它的初始化方式是创建一个新的StringBuilder对象(在堆上)并向其追加三个String(每个一个对象占用堆内存),然后创建一个新的String对象(也占用堆内存),并在 nextPoint 中存储对它的引用。 StringBuilder 将对累积的字符数据进行某种关联存储;这不会与所涉及的任何字符串重叠。

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

which solution is better when i'm using "nextPoint" varaible or "downPoint" variable?

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

what is result of my code snippet [?]

放在一个class,运行里面,自己找找看。或者从代码中找出来。这不是您应该需要我们为您解答的问题。

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

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

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