簡體   English   中英

初始化java.math.BigInteger

[英]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。

它們最終都引用了一個值為0BigInteger

  1. valueOf是靜態的,因此您無需創建對象即可獲取值。
  2. 如果你調用構造函數,那么每次都會獲得一個新對象。

讓我們做一個快速實驗:

@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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM