可变内存分配如何工作?
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) 存储生成的字符串引用。但由于引用大小相同,无论引用什么,都会导致占用相同的字节数。
当我为字符串生成器创建新对象并使用该变量时,内存分配如何工作以及我的代码片段的结果是什么,我的示例代码是
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) 存储生成的字符串引用。但由于引用大小相同,无论引用什么,都会导致占用相同的字节数。