[英]Initializing java.math.BigInteger
對不起,這可能看起來像是一個愚蠢的是或否的問題,但我對此很新,所以我需要一個答案。
BigInteger i = BigInteger.valueOf(0);
和
BigInteger i = new BigInteger("0");
它們是一樣的嗎?
它們最終都引用了一個值為0的BigInteger
,但它們的效果並不相同。 特別是,由於valueOf
是一個靜態方法,它可以使用緩存,如果你調用它兩次,則返回相同的引用:
BigInteger a = BigInteger.valueOf(0);
BigInteger b = BigInteger.valueOf(0);
System.out.println(a == b); // true on my machine
這似乎沒有保證 ,但鑒於文檔 ,它肯定有點預期 :
返回一個
BigInteger
其值等於指定long的值。 這種“靜態工廠方法”優先於(長)構造函數提供,因為它允許重用常用的BigIntegers。
當你調用構造函數時,你每次都會得到一個新實例。
也就是說,對於這個特例,我只使用BigInteger.ZERO
......
是的,在這種情況下,它們是相同的(如果用“相同”表示“相等的實例”),你也可以說BigInteger.ZERO
。
但是對於非常大的數字,你只能使用String構造函數:
new BigInteger("12345678901234567890123456789012345") // too long for long
BigInteger i = BigInteger.valueOf(0);
BigInteger i1 = new BigInteger("0");
System.out.println(i==i1);//false
System.out.println(i.equals(i1));//true
public static BigInteger valueOf(long val)
返回一個BigInteger,其值等於指定long的值。 這種“靜態工廠方法”優先於(長)構造函數提供,因為它允許重用常用的BigIntegers。參數: val - 要返回的BigInteger的值。
返回:具有指定值的BigInteger。BigInteger(String val)
將BigInteger的十進制字符串表示形式轉換為BigInteger。
它們最終都引用了一個值為0
的BigInteger
。
valueOf
是靜態的,因此您無需創建對象即可獲取值。 讓我們做一個快速實驗:
@Test
public void testBigIntegers() {
assertThat(BigInteger.valueOf(0), is(new BigInteger("0")));
}
所以,准確地說:這里有兩個相同的 BigInteger對象。 由於BigInteger構造函數只允許輸入“整數”整數; 對於valueOf()能夠為您提供的所有值都是如此。
但是因為這兩個對象是以不同的方式創建的,所以這里確實有兩個不同的對象。 而調用valueOf(0)兩次可能會為兩個調用提供相同的對象(引用)。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.