【发布时间】:2018-01-16 04:47:48
【问题描述】:
当我在思考各种类型的内存使用情况时,我开始对 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 值。
- 那么对于单个“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(1) 还是假设是错误的?
【问题讨论】:
-
“为什么人们在 Java 方法中传递像 int 这样的原语?”因为 Java 是一种将可读、可维护的代码置于高效乱码之上的语言。
-
顺便说一句,当然,在分析递归函数时,您应该计算渐近内存使用中隐式堆栈的大小。您是否承担尾随电话是一个有趣的考虑因素..
-
@Nathan 仅适用于
Integer包装类,而不是原始int。 -
@Nathan 从值 -2^31 到 +2^31-1 的所有整数的行为方式完全相同。不超过 127 的值没有什么特别之处。您一定在考虑
Integer而不是int。 -
两种方法都使用 O(n) 堆栈内存,因为两种方法都使用参数(对于 Big-O 表示法,参数是需要 4 个字节的 int 还是对4 字节或 8 字节的 int 数组)
标签: java arrays memory jvm int