Java 按引用传递和编译器优化

标签 java function reference parameter-passing

在函数 fermatFactorization() 中, ab被作为引用参数传递,因为我使用的是 Long类(class)。然而,在函数 testFermatFactorization() 中当我经过a时和bfermatFactorization()a 的值和b不改变,所以testFermatFactorization()打印(0)(0) 。我通过打印 a 来测试这一点和bfermatFactorization() ,我得到了我期望的输出。

我忽略了什么?编译器可以改变 abfermatFactorization()因为它们只是被分配给?(可疑)

public static void fermatFactorization(Long n, Long a, Long b)   
//PRE:  n is the integer to be factored
//POST: a and b will be the factors of n
{
    Long v = 1L;
    Long x = ((Double)Math.ceil(Math.sqrt(n))).longValue();
    //System.out.println("x: " + x);
    Long u = 2*x + 1;
    Long r = x*x - n;

    while(r != 0)                 //we are looking for the condition x^2 - y^2 - n to be zero
    {
        while(r>0)
        {
            r = r - v;            //update our condition
            v = v + 2;            //v keeps track of (y+1)^2 - y^2 = 2y+1, increase the "y"
        }
        while(r<0)
        {
            r = r + u;
            u = u + 2;            //keeps track of (x+1)^2 - x^2 = 2x+1, increases the "x"
        }
    }

    a = (u + v - 2)/2;            //remember what u and v equal; --> (2x+1 + 2y+1 - 2)/2 = x+y
    b = (u - v)/2;                //                             --> (2x+1 -(2y+1))/2 = x-y
}

public static void testFermatFactorization(Long number)
{
    Long a = 0L;
    Long b = 0L;
    fermatFactorization(number, a, b);
    System.out.printf("Fermat Factorization(%d) = (%d)(%d)\n", number, a, b);
}

最佳答案

Java 是按值传递的。如果为参数分配新值,它不会影响调用方方法中的值。

您有两个选择:

  • 使您的方法返回 ab - 在 int[] 中或使用单独的 FactorizationRezult 有两个字段的类。这样,您将在调用的方法中将 ab 声明为局部变量,而不是将它们作为参数。这是最可取的方法。

  • 另一种方法是使用 MutableLong 并使用 setValue(..) 方法 - 这样更改将影响调用方方法中的对象。这是不太可取的

关于Java 按引用传递和编译器优化,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12698414/

相关文章:

java - Hibernate 的双向 OneToOne 关系在同一个类中不起作用

java - 具有 customDefaultModel 覆盖的 JTextField 不允许粘贴

java - 使用 jackson 创建简单的 JSON 结构

mysql - 如何检查黑客是否修改或更改了表或向数据库添加了列

.net - DLL不复制到bin文件夹

c++ - 确保给出一个不会变得无效的引用

java - Compiler.getTask 编译器错误

winapi - Win 7 SndVol混音器如何工作?它使用了哪些WinAPI函数?

function - 在 Codeigniter Controller 的构造函数中加载的模型不可用于相同 Controller 的其他功能

c++ - 数据成员 int 引用