Извините, это может показаться глупым вопросом "да" или "нет", но я новичок в этом, поэтому мне нужен ответ.

BigInteger i = BigInteger.valueOf(0);

А также

BigInteger i = new BigInteger("0");

Они одинаковы?

8
user6785796 7 Сен 2016 в 09:17

5 ответов

Лучший ответ

Да, в этом случае они одинаковы (если под «одинаковыми» вы подразумеваете «равные экземпляры»), и вы также можете сказать BigInteger.ZERO.

Но в случае действительно больших чисел вы можете использовать только конструктор String:

new BigInteger("12345678901234567890123456789012345")  // too long for long
4
Thilo 7 Сен 2016 в 06:22

Оба они заканчиваются ссылкой на BigInteger со значением 0, но по сути они не идентичны. В частности, поскольку valueOf является статическим методом, он может использовать кеширование и возвращать ту же ссылку, если вы вызываете его дважды:

BigInteger a = BigInteger.valueOf(0);
BigInteger b = BigInteger.valueOf(0);
System.out.println(a == b); // true on my machine

Это не кажется гарантированным , но определенно отчасти ожидаемым , учитывая документация :

Возвращает BigInteger, значение которого равно значению указанного long. Этот «статический фабричный метод» предоставляется вместо (длинного) конструктора, поскольку он позволяет повторно использовать часто используемые BigInteger.

Когда вы вызываете конструктор, вы действительно каждый раз будете получать новый экземпляр.

Тем не менее, для этого конкретного примера я бы просто использовал BigInteger.ZERO ...

7
Jon Skeet 7 Сен 2016 в 06:21

Проведем небольшой эксперимент:

@Test
public void testBigIntegers() {
    assertThat(BigInteger.valueOf(0), is(new BigInteger("0")));
}

Итак, если быть точным: у вас есть два равных объекта BigInteger. Поскольку конструктор BigInteger позволяет вводить только целые числа; это верно для всех значений, которые может дать вам valueOf ().

Но поскольку эти два объекта созданы по-разному, здесь действительно есть два разных объекта. В то время как двойной вызов valueOf (0) вполне может дать один и тот же объект (ссылку) для обоих вызовов.

1
GhostCat 7 Сен 2016 в 06:25
  BigInteger i = BigInteger.valueOf(0);
                BigInteger i1 = new BigInteger("0");
                System.out.println(i==i1);//false
                System.out.println(i.equals(i1));//true
3
bhanu avinash 7 Сен 2016 в 06:25