BigInteger类中的无用变量,为什么?

时间:2012-11-28 01:31:41

标签: java

我今天浏览了Java代码,并注意到了一些事情。

int[] m = mag;
int len = m.length;
int[] xm = xInt.mag;
if (len != xm.length)
    return false;

(这是BigInteger类,可以通过解压缩src.zip找到。它位于equals方法中。)为什么创建了一个全新的变量m什么时候只使用一次?为什么代码不是int len = mag.length?我也在另一种方法(bitLength)中看到了这一点,同样,m只使用了一次。这样做有什么好处,还是这个类的创造者只是一个错误?

编辑:正如@usernametbd指出的那样,稍后会使用它:

for (int i = 0; i < len; i++)
    if (xm[i] != m[i])
        return false;

但他们仍然可以使用mag。为什么要制作一个全新的变量?

在另一个函数中(在同一个类中,bitLength),会生成一个新变量m,并且只使用一次。

4 个答案:

答案 0 :(得分:2)

因为mag是一个字段,所以m是局部变量。尽管现代JIT可以自动创建这样的替代局部变量,但访问局部变量可能会更快。

顺便说一句,你应该告诉你的方法是什么(我发现它是equals()),并引用原始来源(它是可用的)而不是反编译的。

答案 1 :(得分:1)

进一步向下(几行),他们使用

for (int i = 0; i < len; i++)
    if (xm[i] != m[i])
        return false;

所以m并非完全孤立。他们肯定会使用mag代替,但这只是一个设计选择。

答案 2 :(得分:0)

当您通过反射(即恒定时间操作)调用length(公共最终成员变量Array)时。但C++中的情况并不相同。你必须获得第一个数组大小(以字节为单位),然后将此结果除以int的大小以获得精确值(也许有更好的方法)。我认为开发人员从C ++时代就有同样的反应,并将值带入局部变量中以便多次使用。

答案 3 :(得分:0)

为什么对你很重要?该语句不是复制数组,只是复制引用 - 指针。并且“m”可能会被分配到寄存器中,而JVM标准要求通常必须从对象中重新获取“mag” - JITC不能自由地优化远场引用。