在我思考各种类型的内存使用情况时,我开始对Java在将整数传递给方法时如何利用内存感到有些困惑。
比如说,我有以下代码:
public static void main (String[] args){
int i = 4;
addUp(i);
}
public static int addUp(int i){
if(i == 0) return 0;
else return addUp(i - 1);
}
在以下示例中,我想知道我的逻辑是否正确:
- 我最初为整数i = 4创建了一个内存。然后我将它传递给一个方法。但是,由于Java中的基元类型不是指针,在addUp(i == 4)中,我创建另一个整数i = 4。然后,在addUp(i == 3),addUp(i == 2),addUp(i == 1),addUp(i == 0)中有另一个i值,每次都会分配一个新的i值。
- 因此,对于单个“int i”值,我使用了6个整数值内存。
如果我总是通过数组传递参数:
public static void main (String[] args){
int[] i = {4};
// int tempI = i[0];
addUp(i);
}
public static int addUp(int[] i){
if(i[0] == 0) return 0;
else return addUp(i[0] = i[0] - 1);
}
-由于我创建了一个大小为1的整数数组,然后将其传递给addUp,然后再传递给addUp(i[0] == 3)、addUp(i[0] == 2)、addUp(i[0] == 1)、addUp(i[0] == 0),因此我只使用了1个整数数组内存空间,因此更加成本高效。此外,如果我事先制作一个int值来存储i[0]的初始值,我仍然拥有我的“原始”值。
这就引出了一个问题,为什么人们要在Java方法中传递诸如int之类的基元类型?直接传递那些基元类型的数组值难道不更节省内存吗?或者第一个例子总体上仍然是O(1)内存吗?
除此之外,我还想知道使用int[]和int的内存差异,尤其是对于大小为1的情况。预先谢谢您。我只是想知道如何更有效地使用Java,这让我想到了这个问题。
感谢所有答案!我现在很快想知道如果我“分析”每段代码的大O内存,它们是否都被认为是O(1),还是假设这样会错?
Integer
包装类,而不适用于原始的int
类型。 - user439793