如果我必须存储3个整数值并且想要检索相同的值,则不需要进行任何计算。以下哪一个是更好的选择?
int i,j,k;
or
int [] arr = new int[3];
数组将分配3个连续的内存块(在JVM分配空间之后)或随机地将变量分配给某个内存位置(我认为与数组相比,JVM会占用更少的时间)。
如果问题太微不足道,请道歉。
答案 0 :(得分:5)
答案是:这取决于。
你不应该过多考虑这种情况对性能的影响。两者之间的表现差异不足以引起注意。
您需要注意的是可读性和可维护性。
如果i
,j
和k
,基本上都是相同的意思,你将以同样的方式使用它们,你觉得你可能想要迭代它们,然后使用数组可能是有意义的,这样你就可以更容易地迭代它们。
如果它们具有不同的值,具有不同的含义,并且您将以不同的方式使用它们,那么将它们包含在数组中是没有意义的。每个人都应该拥有自己的身份,以及他们自己的描述性变量名。
答案 1 :(得分:3)
选择最有意义的语义:
在性能方面,传统的局部变量比数组更快。在特定情况下,可以在堆栈上分配阵列。在特定情况下,可以删除绑定检查。
但是不要根据性能做出决定,除非你先做正确的其他事情和你有彻底的测试和这段特殊的代码是一个表现 - 关键的热点和你肯定它是你应用程序的瓶颈。
答案 2 :(得分:1)
这取决于你如何访问它们。数组当然是开销,因为您将首先计算对值的引用然后获取它。因此,如果这些值完全不相关,则数组很糟糕,甚至可能算作代码混淆。但是,i
,j
,k
这样的命名变量也是一种混淆。混淆最好在构建阶段自动完成,有像Proguard™这样的工具可以做到。
答案 3 :(得分:1)
这取决于,但最可能,使用不同的变量是要走的路。
一般来说,不做微优化。没有人会注意到性能上的任何差异。可读和可维护的代码是高级语言中真正重要的代码。
答案 4 :(得分:1)
两者完全不同,并且用于不同的目的。
在第一个示例中,您提供了int i,j,k;
,您正在将值推送到堆栈,
该堆栈用于短期使用和小数据大小,即函数调用参数和迭代器状态。
您给int [] arr = new int[3];
new
关键字的第二个示例是为操作系统为堆进程分配实际内存。
堆栈针对短期使用进行了优化,所有(大多数)所有CPU都有一个专用于指向堆栈位置的寄存器,并使堆栈成为小脏变量的基础。堆栈的大小也是有限的(理论上),它的大小只有几KB(平均情况)。
另一方面,堆是适用于大型数据类型和适当内存管理的内存分配。
所以,这两者可能用于同一件事,但并不意味着它是对的。 Arrays / Objects / Dicts从堆中进入已分配的内存,函数参数(通常是迭代器索引)进入堆栈。