1

我对 Java 编程比较陌生,并且对它的面向对象方面有一个小问题。所以,让我们开始吧!我最近编写了一个程序来查找 0 和一个数字 x 之间的所有质数,其中“i”是质数。在这个程序中,有两行与以下相同。

  BigInteger one = BigInteger.valueOf(i);
    one = one.nextProbablePrime();

这些行的目的是将整数 i 转换为 BigInteger 以使用 nextProbablePrime 方法。回想起来,我发现我没有使用关键字“new”,因此没有创建 BigInteger 类的实例,但程序仍然可以顺利编译和运行。如果没有创建 BigInteger 类的实例,为什么程序能够使用 nextProbablePrime 方法编译和运行?此外,不会在其他情况下以及使用其他类和方法创建对象。此外,它会阻止我使用 BigInteger 类的全部功能吗?它是否被认为是良好的编程习惯?

我还把上面的两行代码改写成这两行代码,程序的其余部分保持不变。

BigInteger one = new BigInteger(String.valueOf(i));
    one = one.nextProbablePrime();  

我更改了两者的第一行以包括使用“新”一词。正如我所料,它运行没有任何缺陷。回到我的其他问题,哪个更好?尽管我使用的是类或方法,哪一个会给我最大的功能,哪一个更被认为是好的实践?

综上所述,我的问题是: 1.哪一个是正确的? 2.无论我使用的是什么类或方法,哪一种适用于所有情况? 3.哪一个被认为是好的编程习惯? 4.第一个如何在不创建对象的情况下工作?

Biginteger 类的快速链接,对于那些可能想要查看它的人 -这里

4

6 回答 6

15

确实创建了BigInteger该类的一个实例。只是该new关键字方法实现中的某处使用BigInteger.valueOf

BigInteger.valueOf一般效率更高。BigInteger它可以为某些值重用相同的对象i——也许是 0,或者也许像Integer.valueOf(int),它从 -128 到 128。

BigInteger.valueOf被称为工厂方法,并且经常被推荐。除此之外,工厂方法可以有名称,而构造函数则不能;他们对实施有更多的控制权;有很多很好的理由。事实上,Effective Java中的第一个建议是“考虑静态工厂方法而不是构造函数”。

如果您实际查看 的源代码BigInteger.valueOf您会看到它正在做的事情:它检查它是否可以重用一个常量值——ZERO或者一个小的正值或负值——如果失败了,它就会继续调用new BigInteger(value),尽管它使用了一个内部私有构造函数,该构造函数采用 along而不是使用String.valueOf.

于 2013-07-29T18:37:58.357 回答
1

第一种方法使用 BigInteger 的静态方法。这将是我的偏好,尽管两者都工作得很好并且都做同样的事情。

关键字在内存中new创建对象的实际实例。由于该BigInteger.valueOf(i);方法是静态的,它不需要 BigInteger 的实例(该方法本身即会为您创建一个新的 BigInteger)。

于 2013-07-29T18:38:38.310 回答
1

如果您查看文档:

公共静态 BigInteger valueOf(long val)

返回一个 BigInteger,其值等于指定 long 的值。这种“静态工厂方法”优先于(长)构造函数提供,因为它允许重用经常使用的 BigInteger。

参数: val - 要返回的 BigInteger 的值。返回: 具有指定值的 BigInteger。

您正在调用的方法正在返回 BigInteger 的新实例

这里: http ://docs.oracle.com/javase/7/docs/api/java/math/BigInteger.html

于 2013-07-29T18:39:35.307 回答
0

您在这里处理的是 BigInteger 类的静态方法。

此方法将返回一个自动分配的 BigInteger 实例,这就是 Louis 正确的原因。newvalueOf方法中为您使用。

于 2013-07-29T18:39:25.770 回答
0

首先对象是在内部创建的(* 可能并不总是)。

valueOf()方法有可能在一些小范围内缓存 BigInteger 以不浪费资源的原因之一。(创建 1 个值为 5 的对象,而不是大量对象)。

您必须在调用时创建对象,new但您可以在方法内部的 if 语句中重用旧对象

两种变体都可以。但最好使用valueOf,因为你

  • 不要创建不必要的字符串。
  • 有可能
于 2013-07-29T18:39:29.767 回答
0

要回答您的所有问题:

  1. 两者都是 100% 正确的。

  2. 两者都可以在任何合理的情况下工作。

  3. 第一种方法可能具有最少的开销(滞后)。

  4. 第一种方法确实在您调用的函数内部创建了一个对象,如下所示:

    公共静态 BigInteger valueOf(long val) { BigInteger bigInteger = new BigInteger(); // 做一些事情让 val 变成 BigInteger return bigInteger; }

因此,当它返回您的变量时,它已经使用了new关键字。

于 2013-07-29T18:43:30.410 回答