我对Java编程相对较新,并且面向对象方面存在一个小问题。那么,让我们来吧!我最近编写了一个程序来查找0和数字x之间的所有素数,其中“i”是素数。在这个程序中,两行与以下相同。
BigInteger one = BigInteger.valueOf(i);
one = one.nextProbablePrime();
这些行的目的是将整数i转换为BigInteger以使用nextProbablePrime方法。回想一下,我看到我没有使用关键字“new”,因此没有创建BigInteger类的实例,但程序仍然编译并运行顺利。为什么程序能够使用nextProbablePrime方法,如果没有创建BigInteger类的实例,则编译并运行?此外,不会在其他情况下以及使用其他类和方法创建对象。此外,它是否会阻止我使用BigInteger类的全部功能,是否被认为是良好的编程习惯?
我还将上面的两行代码重写为两行代码,使程序的其余部分保持不变。
BigInteger one = new BigInteger(String.valueOf(i));
one = one.nextProbablePrime();
我改变了两者的第一行,包括使用“new”这个词。正如我所料,它没有任何缺陷。回到我的其他问题,哪一个更好?尽管我正在使用哪种类或方法,哪一种更适合做,但哪一种能给我最大的功能呢?
总结一下,我的问题是: 1. 哪一个是正确的? 2. 哪种情况适用于所有情况,尽管我使用的是类或方法? 3. 哪一个被认为是良好的编程习惯? 4. 第一个如何在不创建对象的情况下工作?
Biginteger类的快速链接,适合那些可能想要查看它的人 - here
答案 0 :(得分:15)
您 创建了BigInteger
类的实例。只是new
关键字在里面内部使用{/ 1}}方法的实现。
BigInteger.valueOf
通常效率更高。它可以为BigInteger.valueOf
的某些值重用相同的BigInteger
对象 - 可能为0,或者可能为i
,它从-128到128.
Integer.valueOf(int)
被称为工厂方法,经常被推荐。除其他外,工厂方法可以有名称,其中构造函数不能;他们对实施有更多的控制权;有很多很好的理由。实际上, Effective Java 中的第一个建议是“考虑静态工厂方法而不是构造函数。”
如果您实际查找BigInteger.valueOf
的{{3}},您可以看到它正在做的事情:它检查它是否可以重复使用常量值 - BigInteger.valueOf
或小的正值或者是否定值 - 如果没有,它就会继续调用ZERO
,尽管它使用内部私有构造函数,它使用new BigInteger(value)
而不是long
。
答案 1 :(得分:1)
第一种方法使用BigInteger中的静态方法。这可能是我的偏好,虽然两者都有效但两者都完全相同。
new
关键字在内存中创建对象的实际实例。由于BigInteger.valueOf(i);
方法是静态的,因此它不需要BigInteger的实例(此方法本身就是为您创建一个新的BigInteger)。
答案 2 :(得分:1)
如果查看文档:
public static BigInteger valueOf(long val)
返回一个BigInteger ,其值等于指定的值 长。优先提供这种“静态工厂方法” (长)构造函数因为它允许重用经常使用的 BigIntegers。
参数: val - 要返回的BigInteger的值。返回: 具有指定值的BigInteger。
您正在调用的方法是返回BigInteger的新实例
此处:http://docs.oracle.com/javase/7/docs/api/java/math/BigInteger.html
答案 3 :(得分:0)
您在这里处理的是BigInteger类的静态方法。
此方法将返回一个自动分配的BigInteger实例,这就是路易斯正确的原因。 new
方法中使用了valueOf
。
答案 4 :(得分:0)
首先在内部创建对象(*可能并非总是如此)。
使valueOf()
方法有可能在一些小范围内缓存BigInteger而不浪费资源的原因之一。 (创建1个值为5的对象,而不是吨数)。
你必须在调用new
时创建对象,但你可以在if语句里面重用旧对象
两种变体都可以。但最好使用valueOf
因为你
答案 5 :(得分:0)
回答你的所有问题:
两者都是100%正确。
两者都适用于任何合理的情况。
第一种方法可能具有最小的开销(滞后)。
第一种方法会在您调用的函数内部创建一个对象,如下所示:
public static BigInteger valueOf(long val){ BigInteger bigInteger = new BigInteger(); //做一些事情让val成为BigInteger 返回bigInteger; }
因此,当它返回到您的变量时,它已经使用了new
关键字。