JavaRush /Blog Java /Random-PL /Przewodnik po klasach całkowitych Java

Przewodnik po klasach całkowitych Java

Opublikowano w grupie Random-PL
W tym artykule porozmawiamy o klasie Integer. Rozważmy te pytania:
  • czym są klasy opakowania;
  • automatyczne pakowanie/rozpakowywanie prymitywów;
  • działanie klasy Integer, jej metody i stałe.
Samouczek dotyczący klasy liczb całkowitych w Javie — 1

Klasy otokowe typów pierwotnych

Jak wiadomo, Java ma różne typy danych, które można podzielić na dwa bloki:
  • prymitywny;
  • odniesienie.
W Javie istnieje kilka prymitywnych typów danych:
  • liczby całkowite - bajt, krótki, int, długi;
  • liczby zmiennoprzecinkowe (rzeczywiste) - float, double;
  • logiczny typ danych - boolean;
  • znakowy typ danych - char.
Każdy prymitywny typ danych ma własną klasę opakowania. Referencyjny typ danych, który otacza swojego pierwotnego młodszego brata obiektem Java. Poniżej znajdują się prymitywne typy danych i odpowiadające im klasy opakowań:
Typ prymitywny Klasa opakowania
bajt Bajt
krótki Krótki
wew Liczba całkowita
długi Długi
platforma Platforma
podwójnie Podwójnie
wartość logiczna Wartość logiczna
zwęglać Postać
W sensie praktycznym prymitywy i ich klasy opakowania mają ze sobą wiele wspólnego. Większość operacji wykonuje się identycznie. Jednak klasy opakowania mają wiele cech, które nie są charakterystyczne dla prymitywów. Po pierwsze, są klasy: pracując z klasami opakowującymi, pracujemy z obiektami. Po drugie (wszystko, co dalej wynika z punktu pierwszego), obiekty te mogą mieć wartość null. Po trzecie, klasy opakowania udostępniają szereg stałych i metod, które ułatwiają pracę z określonym typem danych. W tym artykule przyjrzymy się bliżej pracy z klasą Integer.

Liczba całkowita

Klasa Integer jest klasą opakowującą typu pierwotnego int. Klasa ta zawiera jedno pole typu int. Jako klasa opakowująca, Integer udostępnia różne metody pracy z intami, a także szereg metod konwersji int na String i String na int. Poniżej przyjrzymy się różnym przykładom pracy z klasą. Zacznijmy od stworzenia. Najczęściej stosowaną (i najłatwiejszą w użyciu) jest następująca opcja tworzenia:
Integer a = 3;
Oznacza to, że inicjalizacja zmiennej Integer w tym przypadku jest podobna do inicjalizacji zmiennej int. Co więcej, zmienną Integer można zainicjować wartością zmiennej int:
int i = 5;
Integer x = i;
System.out.println(x); // 5
W powyższym przypadku automatyczne pakowanie następuje w sposób dorozumiany. Porozmawiamy o tym więcej poniżej. Oprócz wymienionych powyżej opcji inicjalizacji, zmienną Integer można utworzyć podobnie jak inne obiekty, używając konstruktora i słowa kluczowego new:
Integer x = new Integer(25);
System.out.println(x);
Jednak pisanie i czytanie zajmuje więcej czasu, więc ta opcja jest najmniej popularna. Ze zmiennymi Integer możesz zrobić wszystko, co możesz zrobić ze zmiennymi int. Oni mogą być:
Zginać

Integer a = 6;
Integer b = 2;
Integer c = a + b;
System.out.println(c); // 8
Odejmować

Integer a = 6;
Integer b = 2;
Integer c = a - b;
System.out.println(c); // 4
Zwielokrotniać

Integer a = 6;
Integer b = 2;
Integer c = a * b;
System.out.println(c); // 12
Dzielić

Integer a = 6;
Integer b = 2;
Integer c = a / b;
System.out.println(c); // 3
Przyrost

Integer a = 6;
a++;
++a;
System.out.println(a); // 8
Zmniejszenie

Integer a = 6;
a--;
--a;
System.out.println(a); // 4
Jednak przy tym wszystkim trzeba zachować ostrożność i pamiętać, że Integer jest typem danych referencyjnych, a zmienna tego typu może mieć wartość null. W tym przypadku (jeśli zmienna ma wartość null) lepiej powstrzymać się od operacji arytmetycznych (i wszelkich innych, w których wartość null nie wróży dobrze). Oto przykład:
Integer a = null;
Integer b = a + 1; // Здесь мы упадем с "Exception in thread "main" java.lang.NullPointerException"
System.out.println(b);
Większość operacji porównawczych przeprowadza się w taki sam sposób, jak w przypadku typu pierwotnego int:
Integer a = 1;
Integer b = 2;

System.out.println(a > b);
System.out.println(a >= b);
System.out.println(a < b);
System.out.println(a <= b);
Wyjście:

false
false
true
true
Wyróżnia się operacja porównywania dwóch zmiennych typu Integer. I chodzi o to, że Integer jest referencyjnym typem danych, a jego zmienne przechowują odniesienia do wartości, a nie do samych wartości (obiektów). Przejawy tego faktu można zaobserwować wykonując następujący fragment kodu:
Integer a = 1;
Integer b = 1;
Integer c = new Integer(1);

System.out.println(a == b); // true
System.out.println(a == c); // false
Wynik pierwszej równości będzie prawdziwy, a drugi fałszywy. Dzieje się tak, ponieważ w pierwszym przypadku porównujemy dwie zmienne („a” i „b”) przechowujące referencje do tego samego obiektu. Natomiast w drugim przypadku porównujemy dwie zmienne, które odnoszą się do dwóch różnych obiektów (tworząc zmienną „c” stworzyliśmy nowy obiekt). Podajmy inny ciekawy przykład:
Integer a = 1;
Integer b = 1;

Integer x = 2020;
Integer y = 2020;

System.out.println(a == b); // true
System.out.println(x == y); // false
Jak widzimy, wynik pierwszego porównania jest prawdziwy, a wynik drugiego jest fałszywy. Wszystko zależy od buforowania. Wszystkie liczby całkowite z zakresu od -128 do 127 włącznie (wartości te można dostosować) są buforowane. Kiedy więc tworzymy nową zmienną i przypisujemy jej wartość całkowitą z zakresu -128 do 127, nie tworzymy nowego obiektu, ale raczej przypisujemy zmiennej odwołanie do już utworzonego obiektu w pamięci podręcznej. Znając ten fakt, powyższy przykład nie wydaje się już tak mistyczny. Zmienne a i b odnoszą się do tego samego obiektu - obiektu z pamięci podręcznej. A podczas inicjalizacji zmiennych x i y za każdym razem tworzyliśmy nowy obiekt, a zmienne te przechowywały odniesienia do różnych obiektów. A jak wiadomo, operator == porównuje wartości zmiennych, a wartościami zmiennych referencyjnych są referencje. Aby dokładnie sprawdzić równość między dwiema zmiennymi typu Integer, należy użyć (bez względu na to, jak banalnie to zabrzmi) metody równości. Przepiszmy powyższy przykład:
Integer a = 1;
Integer b = 1;

Integer x = 2020;
Integer y = 2020;

System.out.println(a.equals(b)); // true
System.out.println(x.equals(y)); // true

Automatyczne pakowanie i rozpakowywanie Liczba całkowita

Co to jest automatyczne pakowanie i rozpakowywanie? Tworząc nowe zmienne typu Integer, zastosowaliśmy następującą konstrukcję:
Integer a = 2020;
W ten sposób utworzyliśmy nowy obiekt bez użycia nowego operatora klucza. Jest to możliwe dzięki mechanizmowi autopakowania typu pierwotnego int. Odwrotna procedura ma miejsce podczas przypisywania pierwotnej zmiennej int do wartości zmiennej referencyjnej typu Integer:
Integer a = 2020;
int x = a;
W tym przypadku wydaje się, że przypisaliśmy referencję (mianowicie referencją do obiektu jest wartość zmiennej „a”) do zmiennej pierwotnej. Ale tak naprawdę, dzięki mechanizmowi automatycznego rozpakowywania, do zmiennej „x” została zapisana wartość 2020. Automatyczne pakowanie/rozpakowywanie jest bardzo powszechnym zjawiskiem w Javie. Często zdarza się to samo, czasem nawet bez wiedzy programisty. Ale nadal musisz wiedzieć o tym zjawisku. Mamy ciekawy artykuł na ten temat na Javarush .

Stałe klasy całkowitej

Klasa Integer udostępnia różne stałe i metody pracy z liczbami całkowitymi. W tej części przyjrzymy się bliżej niektórym z nich w praktyce. Zacznijmy od stałych. Poniższa tabela pokazuje wszystkie stałe klasy:
Kostanta Opis
ROZMIAR Liczba bitów w dwucyfrowym systemie liczbowym zajmowanych przez typ int
BAJTY Liczba bajtów w dwucyfrowym systemie liczbowym zajmowanych przez typ int
MAKSYMALNA WARTOŚĆ Maksymalna wartość, jaką może przechowywać typ int
MIN_VALUE Minimalna wartość, jaką może przechowywać typ int
TYP Zwraca obiekt typu Class z typu int
Przyjrzyjmy się wartościom wszystkich tych stałych, uruchamiając następujący kod:
public static void main(String[] args) {
        System.out.println(Integer.SIZE);
        System.out.println(Integer.BYTES);
        System.out.println(Integer.MAX_VALUE);
        System.out.println(Integer.MIN_VALUE);
        System.out.println(Integer.TYPE);
}
W rezultacie otrzymujemy następujące dane wyjściowe:

32
4
2147483647
-2147483648
int

Metody klasy Integer

Przyjrzyjmy się teraz najczęściej używanym metodom klasy Integer. Tak więc „najwyższe” kierują się metodami konwersji liczby z ciągu lub konwersji ciągu z liczby. Zacznijmy od konwersji ciągu znaków na liczbę. Do tych celów wykorzystywana jest metoda parseInt , której podpis znajduje się poniżej:
  • 
    static int parseInt(String s)
Ta metoda konwertuje String na int. Pokażmy, jak działa ta metoda:
int i = Integer.parseInt("10");
System.out.println(i); // 10
Jeśli konwersja nie jest możliwa — na przykład przekazaliśmy słowo do metody parseInt — zostanie zgłoszony wyjątek NumberFormatException. Metoda parseInt(String s) ma przeciążone rodzeństwo:
  • 
    static int parseInt(String s, int radix)
Ta metoda konwertuje parametr s na int. Parametr radix wskazuje, w jakim systemie liczbowym pierwotnie zapisano liczbę w s, którą należy przekonwertować na int. Przykłady poniżej:
System.out.println(Integer.parseInt("0011", 2)); // 3
System.out.println(Integer.parseInt("10", 8));   // 8
System.out.println(Integer.parseInt("F", 16));   // 15
Metody parseInt zwracają pierwotny typ danych int. Metody te mają analogię - metodę valueOf . Niektóre odmiany tej metody po prostu wywołują wewnętrznie parseInt. Różnica od parseInt polega na tym, że wynikiem valueOf będzie liczba całkowita, a nie int. Rozważmy poniżej wszystkie opcje tej metody i przykład jej działania:
  • statyczna liczba całkowita wartośćOf(int i) - zwraca liczbę całkowitą, której wartość wynosi i;
  • statyczna liczba całkowita wartośćOf(String s) - podobna do parseInt(String s), ale wynikiem będzie liczba całkowita;
  • static Integer valueOf(String s, int radix) - podobnie do parseInt(String s, int radix), ale wynikiem będzie liczba całkowita.
Przykłady:
int a = 5;
Integer x = Integer.valueOf(a);
Integer y = Integer.valueOf("20");
Integer z = Integer.valueOf("20", 8);

System.out.println(x); // 5
System.out.println(y); // 20
System.out.println(z); // 16
Przyjrzeliśmy się metodom, które pozwalają na konwersję String na int/Integer. Odwrotną procedurę uzyskuje się za pomocą metod toString . Możesz wywołać metodę toString na dowolnym obiekcie Integer i uzyskać jego reprezentację w postaci ciągu znaków:
Integer x = 5;
System.out.println(x.toString()); // 5
Jednak ze względu na fakt, że metoda toString jest często wywoływana niejawnie na obiektach (na przykład podczas wysyłania obiektu do konsoli w celu wydrukowania), metoda ta rzadko jest jawnie używana przez programistów. Istnieje również metoda statyczna toString, która pobiera parametr int i konwertuje go na reprezentację w postaci ciągu znaków. Na przykład:
System.out.println(Integer.toString(5)); // 5
Jednakże, podobnie jak w przypadku niestatycznej metody toString, jawne użycie metody statycznej jest rzadkie. Bardziej interesująca jest metoda statyczna toString, która przyjmuje 2 parametry całkowite:
  • static String toString(int i, int radix) - skonwertuje i na reprezentację łańcuchową w systemie liczbowym.
Przykład:
System.out.println(Integer.toString(5, 2)); // 101
Klasa Integer ma kilka metod znajdowania maksimum/minimumu dwóch liczb:
  • static int max(int ​​a, int b) zwróci największą wartość spośród przekazanych zmiennych;
  • static int min(int a, int b) zwróci najmniejszą wartość spośród przekazanych zmiennych.
Przykłady:
int x = 4;
int y = 40;

System.out.println(Integer.max(x,y)); // 40
System.out.println(Integer.min(x,y)); // 4

Wniosek

W tym artykule przyjrzeliśmy się klasie Integer. Rozmawialiśmy o tym, jaki to rodzaj klasy i jakie są klasy opakowania. Spojrzeliśmy na zajęcia z praktycznego punktu widzenia. Przyjrzeliśmy się przykładom operacji arytmetycznych, w tym operacji porównania. Przyjrzeliśmy się zawiłościom porównywania dwóch zmiennych typu Integer i sprawdziliśmy koncepcję obiektów buforowanych. Wspomnieliśmy także o zjawisku automatycznego pakowania/rozpakowywania prymitywnych typów danych. Dodatkowo udało nam się przyjrzeć niektórym metodom klasy Integer, a także pewnym stałym. Podali przykłady konwersji liczb z jednego systemu liczbowego na inny.

Praca domowa

  1. Przestudiuj, jakie są inne metody klasy Integer (możesz je przestudiować na stronie z oficjalną dokumentacją ), napisz w komentarzach, która z metod, które poznałeś (poza tymi podanymi w artykule) jest Twoim zdaniem najbardziej przydatna ( będzie przez Ciebie najczęściej używany). A także uzasadnij swoją opinię.

    PS Nie ma tutaj poprawnych odpowiedzi, ale to ćwiczenie pozwoli ci lepiej przestudiować zajęcia.

  2. Rozwiąż mały prosty problem, aby skonsolidować materiał.

    Mamy dwie liczby:

    1100001001 - w systemie binarnym
    33332 - w systemie liczbowym Quinarnym

    Należy, korzystając wyłącznie z metod klasy Integer, wyznaczyć maksimum spośród dwóch podanych liczb, a następnie wyświetlić różnicę pomiędzy wartością maksymalną i minimalną w trójskładnikowym systemie liczbowym.

  3. Konwertuj maksymalną możliwą wartość Integer na system liczb ósemkowych i wyświetl liczbę cyfr w liczbie wynikowej (policz liczbę programowo).

Komentarze
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION