【问题标题】:How does variable memory allocation work?可变内存分配是如何工作的?
【发布时间】:2025-11-29 05:35:01
【问题描述】:

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

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”变量时,哪个解决方案更好?

【问题讨论】:

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


    【解决方案1】:

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

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

    在你的情况下(1):

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

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

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

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

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

    我的代码 sn-p [?] 的结果是什么

    把它放在一个类中,运行它,然后自己找出来。或者从代码中弄清楚。这不是您应该需要我们为您回答的问题。

    【讨论】:

      【解决方案2】:

      两个 sn-ps 执行相同的方法调用序列,是

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

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

      【讨论】: