2015-08-01 25 views
5

Jestem początkujący. To może być głupie pytanie.Dlaczego "big = big.add (..)" musi być użyty do sumowania BigIntegers?

Mam wiele naprawdę dużych liczb. Muszę znaleźć sumę wszystkich liczb w tablicy. Zdefiniowałem BigInteger i zainicjowałem go do zera. Teraz przejdę przez tablicę i dodam każdy element do tego BigIntegera.

Błąd kompilacji, ale wartość big wciąż wynosiła zero, kod nie zadziałał. Sprawdziłem to i nauczyłem się, że metoda BigInteger add zwraca sumę. Zmieniłem powyższy kod.

big = big.add(b); 

Teraz zadziałało dobrze.

Moje pytanie: Co właściwie się tam dzieje? Dlaczego pierwsza aktualizacja kodu nie stała się wartością big.

Mogę porównać to BigInteger.add() z collection.add()

Więcej wgląd jest doceniana. Dziękuję Ci.

Odpowiedz

8

Dlaczego pierwszy kod nie zaktualizował dużej wartości.

BigInteger jest niezmienny, nie można go zmienić więcej niż można zmienić ciąg lub dowolne prymitywne opakowanie.

np.

String s = "Hello "; 
s.concat("World"); // doesn't change anything. 

s = s.concat("World"); // Updates 's' 

mogę porównać ten BigInteger.add() z kolekcji.dodaj()

Kolekcje są zmienne, ale ta wartość skalarna nie jest.

Używanie zmiennych obiektów to w dużej mierze koncesja na wydajność. Jeśli masz kolekcję, która pobiera kompletną kopię za każdym razem, gdy będzie bardzo źle działać.

+0

Czy możesz dopracować koncesję na wydajność? Dziękuję Ci. – Charan

+1

@Charan Tworzenie nowej kolekcji zawierającej niemal dokładnie takie same odniesienia jak istniejące może być kosztowne, jeśli kolekcja jest duża. Mutable collections pozwalają uzyskać nieznacznie zmodyfikowaną wersję kolekcji bez wykonywania tej pracy. –

+1

@Charan Aby dodać element do ArrayList jednego miliona elementów może być tak proste jak przypisanie referencji i przyrost licznika. Aby skopiować i dodać, musisz skopiować wszystkie odniesienia, wszystkie miliony, aby je dodać. BTW CopyOnWriteArrayList robi to i bardzo wolno modyfikuje dużą kolekcję. –

2

Moje pytanie: Co właściwie się tam dzieje? Dlaczego pierwszy kod nie zaktualizował dużej wartości.

Bo to niezmiennymi arbitralny precyzji całkowitymi oznacza, że ​​nie będzie faktycznie zmienić oryginalny jeden, ale utworzyć nowy kiedy zadzwonić add method.Note niezmienne elementy, dla których niegdyś Object tworzona jest to państwo nie może być changed.For przykład String, Integer, Float itp

Integer i = new Integer(10);//State 1 
i = new Integer(20);//State 2 but does not update state 1 

big.add(b); zwraca wartość po dodaniu który trzeba przechowywać w innej lub tej samej zmiennej.

Zobacz co dodać metoda robi tutaj,

public BigInteger add(BigInteger val) { 
    if (val.signum == 0) 
     return this; 
    if (signum == 0) 
     return val; 
    if (val.signum == signum) 
     return new BigInteger(add(mag, val.mag), signum); 

    int cmp = compareMagnitude(val); 
    if (cmp == 0) 
     return ZERO; 
    int[] resultMag = (cmp > 0 ? subtract(mag, val.mag) 
         : subtract(val.mag, mag)); 
    resultMag = trustedStripLeadingZeroInts(resultMag); 
    //Here it's creating new Object 
    return new BigInteger(resultMag, cmp == signum ? 1 : -1);//<==== 
} 

mogę porównać ten BigInteger.add() z collection.add()

Tutaj powiedzieć List.add rzeczywiście dodać element do listy i możesz zmienić wartość tego elementu, a notatka List.add nie tworzy nowego elementu, ale w rzeczywistości dodaje odniesienie do oryginalnego elementu.

4

to Javadoc do sposobu

public BigInteger add(BigInteger val) 
Returns a BigInteger whose value is (this + val). 

Parameters: 
val - value to be added to this BigInteger. 

Returns: 
this + val 

Oznacza to, że zamiast modyfikacji wartości oblicza się nową wartość i zwraca go. Kiedy wykonujesz big = big.add(b), używasz tej metody, przyjmując wynikową wartość i zastępując oryginalną wartość big.

Zastanów się nad odpowiednikiem używając ints, x i y.

int x = 3; 
int y = 4; 
x + y; // At this point, x is still 3 - as you've not assigned the result of this calculation anywhere 
x = x + y; // Now - x will be 7