【问题标题】:Does Java syntax for iteration across arrays allocate memory?跨数组迭代的Java语法是否分配内存?
【发布时间】:2012-01-15 14:33:05
【问题描述】:

我正在为内存受限的设备编程。因此,我想避免分配任何内存。

显然,在集合、列表等之间进行迭代将分配一个迭代器,从而分配内存。所以应该避免这种情况。

用于遍历数组的本机 java 语法是否分配内存?

Object[] array = getArray()
for(Object elem: array){
  //do something
}

(我想我总是可以使用带有索引变量的老式 for 循环。)

【问题讨论】:

  • 我不知道可以禁用 JVM 垃圾收集器。 anything 在这种情况下是如何工作的?
  • ...更重要的是,这能叫Java吗?
  • 你说得对,GC 并没有完全禁用——我们只是想避免让它运行,所以我更喜欢这样看待它。

标签: java


【解决方案1】:

不。在我检查过的所有编译器中,这是由for 循环(0..array.lengh-1)实现的。

请注意,Java 数组不实现 Iterable。例如,可以通过以下代码看出这一点:

Object[] arr = new String[100];
Iterable<?> iter = arr;  // Error: 'Type mismatch: 
                         //         cannot convert from Object[] to Iterable<?>'

[更新]

这是确定的来源:https://docs.oracle.com/javase/specs/jls/se13/html/jls-14.html#jls-14.14.2

一个for循环比如

for ( VariableModifiersopt Type Identifier: Expression) Statement

当Expression是T[]类型的数组时有如下含义:

T[] a = Expression;
for (int i = 0; i < a.length; i++) {
       VariableModifiersopt Type Identifier = a[i];
       Statement
}

【讨论】:

    【解决方案2】:

    它不分配新内存。以下 foreach 循环:

    for (type var : array) {
        body-of-loop
    }
    

    相当于这个:

    for (int i = 0; i < array.length; i++) { 
        type var = array[i];
        body-of-loop
    }
    

    如您所见,没有进行额外的内存分配。

    【讨论】:

    • 具体来说,类型 var = array[i] 需要一些 stak 空间;)
    • 好吧,int itype var 分配一点堆栈内存(和一个常量值),但没有额外的 heap 内存已分配。
    猜你喜欢
    • 2015-01-22
    • 2020-01-28
    • 1970-01-01
    • 1970-01-01
    • 2018-05-05
    • 2014-05-15
    • 1970-01-01
    • 1970-01-01
    • 2021-11-12
    相关资源
    最近更新 更多