4

我今天浏览 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

4 回答 4

2

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

顺便说一句,您应该已经说出您想到的方法(我发现它是equals()),并引用原始源(它是可用的)而不是反编译的。

于 2012-11-28T02:01:43.720 回答
1

再往下一点(几行),他们使用

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

所以m并不是完全孤立的。他们当然可以mag改用,但这只是一种设计选择。

于 2012-11-28T01:37:56.653 回答
0

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

于 2012-11-28T02:17:59.023 回答
0

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

于 2012-11-28T02:21:04.673 回答