• Najnowsze pytania
  • Bez odpowiedzi
  • Zadaj pytanie
  • Kategorie
  • Tagi
  • Zdobyte punkty
  • Ekipa ninja
  • IRC
  • FAQ
  • Regulamin
  • Książki warte uwagi

Wielkie liczby BigInteger

Object Storage Arubacloud
0 głosów
344 wizyt
pytanie zadane 28 grudnia 2016 w Java przez rubesom Obywatel (1,690 p.)
edycja 28 grudnia 2016 przez rubesom

Cześć,

Mam kod:

		BigInteger wielkaLiczba = new BigInteger("1234567891234235364");
		System.out.println(wielkaLiczba.toString());
		BigInteger a = new BigInteger("1234569876543");
		BigInteger b = new BigInteger("12457893456765");
		BigInteger suma = a.add(b);
		System.out.println(suma.toString());

 

Chodzi mi konkretnie o linijkę

BigInteger suma = a.add(b);

Czemu nie muszę tutaj zrobić na samym początku obiektu suma:

BigInteger suma = new BigInteger();

tylko mogę bez takiej inicjacji dokonać działa na istniejących już obiektach? Jaki zachodzi tu mechanizm?

 

 

I tak samo widzę działa to w tym przykładzie:

Integer x = new Integer(10);
Integer x = 10;

Jaka jest tutaj różnica?

1 odpowiedź

+1 głos
odpowiedź 28 grudnia 2016 przez K0XM4N Gaduła (3,640 p.)
wybrane 28 grudnia 2016 przez rubesom
 
Najlepsza

Nie musisz tworzyć nowego obiektu BigInteger dlatego, że wywołując metodę z obiektu a (a.add()), zwracasz już istniejącą wartość typu BigInteger. Przykład z dokumentacji:

add(BigInteger val)

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

Czyli po prostu masz metodę, która tworzy nową wartość powiększoną o val :P i ją zwraca. Następnie jest ona przypisana do zmiennej suma.

 

 

A co do tego 

Integer x = new Integer(10);
Integer x = 10;

Tworzysz nowy obiekt Integer o wartości 10. Niżej przypisujesz typ prosty do zmiennej x, a następnie jest on poddawany procesowi auto-boxingu (opakowywania)

komentarz 28 grudnia 2016 przez rubesom Obywatel (1,690 p.)
edycja 28 grudnia 2016 przez rubesom

Czyli zapis

Integer x = 10;

jest typem prostym, do momentu utworzenia tego obiektu?

new Integer();

?


 

komentarz 28 grudnia 2016 przez K0XM4N Gaduła (3,640 p.)
Typem prostym będzie int x = 10;
A gdy napiszesz: Integer x= 10; to przypisujesz typ prosty, który następnie automatycznie zamieniany jest na Obiekt Integer, dzięki mechanizmowi opakowania (boxing).
komentarz 28 grudnia 2016 przez rubesom Obywatel (1,690 p.)

To taki zapis:

Integer x= 10;

będzie przekazywany do metody jako wartość czy referencja?

I dalej nie rozumiem tego:

BigInteger suma = a.add(b);

Dla mnie jest to zadeklarowana zmienna bez tworzenia nowego obiektu... To mam to traktować tak, że ten

BigInteger suma

  to typ proty?

 

Napisałeś, że "zwracasz już istniejącą wartość typu BigInteger" - to

suma

będzie referencją do jakiego obiektu?

komentarz 28 grudnia 2016 przez K0XM4N Gaduła (3,640 p.)
Integer x = 10;

Nie będzie to referencja, gdyż do zmiennej x przypisujesz konkretną wartość.To popatrz na to w ten sposób:

Załóżmy, że jestesmy teraz w klasie BigInteger i masz metodę add:
 

BigInteger add(BigInteger value){

return new BigInteger(this + value)

}

metoda ta zwraca nowy obiekt powiększony o value (czyli wartość którą chcesz dodać). Jak widzisz metoda ta jest typu BigInteger więc zwraca nowy obiekt BigInteger.
Suma będzie referencja, czyli wskazaniem miejsca w pamięci nowo utworzonego obiektu (został on utworzony po wywołaniu metody a.add(cośtam) ).

Teraz już łapiesz?

komentarz 28 grudnia 2016 przez rubesom Obywatel (1,690 p.)

Czyli wychodzi na to, że patrzyłem na to bardzo wąsko, bo jeszcze kilka minut temu referencja do obiektu była dla mnie równoznaczna z zapisem:

BigInteger zmienna = new BigInteger();

Gdzie słówko kluczowe new tworzyło mi obiekt do którego się odwołuję.

 

A wracając jeszcze do tego kodu:

Integer x = 10;

Skoro nie mówimy tutaj o referencji to czy zapis:

String zmienna = "kot";

też nie mówimy tutaj o referencji, bo następuje tylko przypisanie wartości do zmiennej typu String?

I w odniesieniu do tego co napisałeś "A gdy napiszesz: Integer x= 10; to przypisujesz typ prosty, który następnie automatycznie zamieniany jest na Obiekt Integer, dzięki mechanizmowi opakowania (boxing)."

Skoro automatycznie jest opakowywany jako Obiekt to czy nie mówimy tutaj o referencji do tego obiektu?

komentarz 28 grudnia 2016 przez K0XM4N Gaduła (3,640 p.)
edycja 29 grudnia 2016 przez K0XM4N

 

Skoro automatycznie jest opakowywany jako Obiekt to czy nie mówimy tutaj o referencji do tego obiektu?

Tak masz racje, popełniłem błąd wcześniej. 
Chodziło mi o takie cos:
int x = 10; <- zmienna typu prostego
Integer x = 10; <- referencja do obiektu Integer. Mimo, że przypisujesz konkretną wartość to jest ona opakowana na typ obiektowy Integer.

A co do Stringa to będzie to wyglądało tak:

String nie ma typu prostego, jest typem Obiektowym. Tworząc sobie zmienna referencyjną String zmienna = "kot"; przypisujesz wartość już istniejącemu obiektowi String w pamięci. Więc, tak jest to referencja do obiektu String. Co więcej Stringi mają to do siebie, ze dysponują pewną pulą już stworzonych stringów. Tak działa JVM. 


Dodam jeszcze, że String zmienna = "kot"; jest znacznie szybszym sposobem niż utworzenie nowego obiektu np. tak: String zmienna2 = new String("kot2"); Dlaczego? Ponieważ nie wykorzystujesz już istniejących obiektów w puli, tylko tworzysz nowy obiekt String.

 

komentarz 28 grudnia 2016 przez rubesom Obywatel (1,690 p.)
@K0XM4N

Dzięki, bardzo mi pomogłeś.

Podobne pytania

0 głosów
1 odpowiedź 120 wizyt
pytanie zadane 29 lipca 2020 w Java przez danielo665 Obywatel (1,040 p.)
0 głosów
2 odpowiedzi 244 wizyt
pytanie zadane 10 lipca 2016 w C i C++ przez niezalogowany
0 głosów
6 odpowiedzi 845 wizyt
pytanie zadane 14 maja 2016 w C i C++ przez DeBos123 Nałogowiec (44,950 p.)

92,573 zapytań

141,423 odpowiedzi

319,646 komentarzy

61,959 pasjonatów

Motyw:

Akcja Pajacyk

Pajacyk od wielu lat dożywia dzieci. Pomóż klikając w zielony brzuszek na stronie. Dziękujemy! ♡

Oto polecana książka warta uwagi.
Pełną listę książek znajdziesz tutaj.

Akademia Sekuraka

Kolejna edycja największej imprezy hakerskiej w Polsce, czyli Mega Sekurak Hacking Party odbędzie się już 20 maja 2024r. Z tej okazji mamy dla Was kod: pasjamshp - jeżeli wpiszecie go w koszyku, to wówczas otrzymacie 40% zniżki na bilet w wersji standard!

Więcej informacji na temat imprezy znajdziecie tutaj. Dziękujemy ekipie Sekuraka za taką fajną zniżkę dla wszystkich Pasjonatów!

Akademia Sekuraka

Niedawno wystartował dodruk tej świetnej, rozchwytywanej książki (około 940 stron). Mamy dla Was kod: pasja (wpiszcie go w koszyku), dzięki któremu otrzymujemy 10% zniżki - dziękujemy zaprzyjaźnionej ekipie Sekuraka za taki bonus dla Pasjonatów! Książka to pierwszy tom z serii o ITsec, który łagodnie wprowadzi w świat bezpieczeństwa IT każdą osobę - warto, polecamy!

...