1. Lista typów pierwotnych

Java ma 8 podstawowych typów pierwotnych. Nazywa się je prymitywnymi, ponieważ wartości tych typów nie są obiektami i są przechowywane bezpośrednio w zmiennych.

Oto tabela zawierająca podsumowanie tych typów:

Typ Rozmiar,
bajty
Zakres wartości Domyślna wartość Opis
byte 1 -128 .. 127 0 Najmniejsza liczba całkowita to jeden bajt
short 2 -32,768 .. 32,767 0 Krótka liczba całkowita, dwa bajty
int 4 -2*109 .. 2* 109 0 Liczba całkowita, 4 bajty
long 8 -9*10 18 .. 9*10 18 0L Długa liczba całkowita, 8 bajtów
float 4 -10 38 .. 10 38 0.0f Ułamkowy, 4 bajty
double 8 -10 308 .. 10 308 0.0d Ułamkowa, podwójna długość, 8 bajtów
boolean 1 true,false false Typ logiczny (tylko true& false)
char 2 0..65.535 '\u0000' Znaki, 2 bajty, wszystkie większe niż 0
Domyślna wartość

Nawiasem mówiąc, ważny niuans. Jeśli zadeklarujesz zmienną klasową (pole klasy) lub statyczną zmienną klasową i nie przypiszesz do niej żadnej wartości, zostanie ona zainicjowana wartością domyślną . Lista takich wartości znajduje się w tabeli.

Lokalne zmienne metody nie mają wartości domyślnych, a jeśli nie przypiszesz żadnej wartości do takiej zmiennej, zostanie ona uznana za niezainicjowaną i nie będzie można użyć jej wartości.

Wróćmy jednak do typów pierwotnych i przyjrzyjmy się im bardziej szczegółowo.



2. Typy całkowite

W Javie są już 4 typy liczb całkowitych: byte, short, inti long. Różnią się wielkością i zakresem wartości, które mogą przechowywać.

Typint

Najczęściej używanym typem jest int. Jego nazwa pochodzi od Int eger (całość). Wszystkie literały całkowite w kodzie mają typ int(chyba że liczba kończy się na L, Flub D).

Zmienne tego typu mogą przyjmować wartości od -2,147,483,648do +2,147,483,647.

To całkiem sporo i wystarczy na prawie każdą okazję. Prawie wszystkie funkcje, które zwracają liczbę, zwracają liczbę typu int.

Przykłady:

Kod Wyjaśnienie
int n = "Строка".length();
Metoda length()zwraca długość łańcucha
String[] array = {"Tic", "Tac", "Toe"};
int n = array.length;
Pole lengthzawiera długość tablicy.

Typshort

Typ shortbierze swoją nazwę od short int. Nazywana jest również krótką liczbą całkowitą . W przeciwieństwie do type int, ma tylko dwa bajty długości i może mieć zakres od -32,768do +32,767.

Oznacza to, że nie możesz nawet zapisać w nim miliona. Nawet 50 tys. Jest to najczęściej używany typ całkowity w Javie. Jest używany głównie, gdy chcą zaoszczędzić na pamięci.

Załóżmy, że masz sytuację, w której z góry wiadomo, że wartości, z którymi pracujesz, nie przekraczają 30 tysięcy, a takich wartości są miliony.

Na przykład piszesz aplikację, która przetwarza obrazy w ultrawysokiej rozdzielczości: jest bit 10na kolor. I masz milion kropek na obrazku. I tutaj już odgrywa rolę, używasz typu intlub short.

Typlong

Ten typ bierze swoją nazwę od long int- jest również nazywany długą liczbą całkowitą . W przeciwieństwie do type intma po prostu gigantyczny zakres wartości: od do -9*1018+9*1018

Dlaczego nie jest to podstawowy typ całkowity?

Rzecz w tym, że Java pojawiła się w połowie lat 90., kiedy większość komputerów była 32-bitowa. A to oznaczało, że wszystkie procesory zostały wyostrzone do pracy z liczbami z 32 bitów. Procesory wiedziały już, jak pracować z 64-bitowymi liczbami całkowitymi, ale operacje na nich były wolniejsze.

Dlatego programiści rozsądnie postanowili stworzyć standardowy typ liczb całkowitych type int, ale longużywać tego typu tylko wtedy, gdy naprawdę nie można się bez niego obejść.

Typbyte

Jest to najmniejsza liczba całkowita w Javie, ale zdecydowanie nie jest najmniej używana. Jego nazwa jest taka sama jak słowo byte- minimalna adresowalna komórka pamięci w Javie.

Rozmiar prawidłowych wartości typu bytenie jest tak duży: od -128do +127. Ale to nie jest jego siła. Ten typ bytejest najczęściej używany, gdy trzeba przechowywać duży blok anonimowych danych w pamięci. Tablica typu bytejest po prostu idealna do tego celu.

Na przykład musisz gdzieś skopiować plik.

Nie musisz przetwarzać zawartości pliku: wystarczy utworzyć lokalizację pamięci (bufor), skopiować do niej zawartość pliku, a następnie zapisać te dane z bufora do innego pliku. Tablica typu bytejest tym, czego potrzebujesz do tych celów.

Co więcej, w zmiennej typu tablicowego przechowywane jest tylko odniesienie do obszaru pamięci. Podczas przekazywania wartości tej zmiennej do jakiejś metody, tylko adres w pamięci zostanie przeniesiony, a sam blok pamięci nie zostanie skopiowany.

byte[] buffer = new byte[1024*1024];
FileInputStream sourceFile = new FileInputStream("c:\\data.txt");
FileOutputStream destFile = new FileOutputStream("c:\\output.txt");
while (true)
{
   int size = sourceFile.read(buffer);   // читаем данные из plik в буфер
   destFile.write(buffer, 0, size);      // записываем данные из буфера в файл

   // прекращаем копирование, если буфер заполнен не w pełni
   if (size < buffer.length) break;
}
sourceFile.close();
destFile.close();


3. Prawdziwe typy

Istnieją również dwa typy rzeczywiste wśród typów pierwotnych. Chociaż nie jest to do końca poprawna nazwa. Oficjalnie nazywa się je liczbami zmiennoprzecinkowymi . Nazwa pochodzi od standardu, w którym kropka (zamiast przecinka) oddziela część całkowitą od części ułamkowej liczby.

Zdrowy:

Każdy kraj ma własne standardy pisania liczb (nagle!).

Wielu z nas jest przyzwyczajonych do wpisywania kropek w celu oddzielenia tysięcy i przecinka w celu oddzielenia części ułamkowej: na przykład миллион целых и 153 тысячныхzapisalibyśmy tak 1.000.000,153. Ale w USA, gdzie mieszkali twórcy Javy, przyjęto inny standard:1,000,000.153

Java ma dwa prymitywne typy zmiennoprzecinkowe: doublei float.

Jak powiedzieliśmy wcześniej, te typy są wewnętrznie uporządkowane w określony sposób: w rzeczywistości wewnątrz każdej zmiennej tego typu nie ma jednej liczby, ale dwie:

Na przykład liczbę ułamkową 987654.321można przedstawić jako . Dlatego w pamięci będzie reprezentowany jako dwie liczby ( mantysa to znacząca część liczby) i ( wykładnik to potęga dziesięciu)0.987654321*1069876543216

Typfloat

Sama nazwa typu floatpochodzi od liczby zmiennoprzecinkowej . Rozmiar tego typu jest dość mały - tylko 4 bajty (32 bity), ale może przechowywać wartości od do . 24 bity są podane dla mantysy, 8 bitów dla wykładnika. Ten typ jest w stanie przechowywać tylko 8 cyfr znaczących.-3.4*10383.4*1038

Takie podejście pozwala przechowywać znacznie większe liczby niż intprzy użyciu tych samych 4 bajtów. Ale robiąc to, poświęcamy dokładność. Część pamięci zajmuje przechowywanie mantysy, więc takie liczby przechowują tylko 6-7 miejsc po przecinku, reszta jest odrzucana.

Przykład:

Kod Wartość zmienna
float a = (float) 123.456789;
123.45679
float a = (float) 12345.9999;
12346.0
float a = (float) -123.456789E-2;
-1.2345679

Jak widać, główną wadą tego typu jest bardzo mała liczba cyfr znaczących i utrata precyzji już przy ósmej cyfrze. Dlatego typ ten floatnie jest zbyt popularny wśród programistów Javy.

Typdouble

Typ doublejest standardowym typem zmiennoprzecinkowym. Jego nazwa pochodzi od podwójnego zmiennoprzecinkowego . Nazywana jest również liczbą zmiennoprzecinkową podwójnej precyzji . Wszystkie literały rzeczywiste są domyślnie typu double.

Ten typ zajmuje 8 bajtów pamięci (64 bity) i może przechowywać wartości od do . Ważnym punktem jest to, że 53 bity są przeznaczone na jego mantysę, a pozostałe 11 bitów na wykładnik.-1.7*103081.7*10308

Pozwala to na przechowywanie 15-17 cyfr znaczących.

Przykład:

Kod Wartość zmienna
double a = 1234567890.1234567890;
1234567890.1234567
double a = 1234567890.1234512345;
1234567890.1234512
double a = 1234567890.1357913579;
1234567890.1357913

Taka precyzja, zwłaszcza w porównaniu z typem float, jest decydująca: 99% wszystkich operacji na liczbach rzeczywistych jest wykonywanych na typie double.

Na wykładnik przydzielony jest bit 11, który pozwala zapisać potęgę dziesięciu od -323do +308(potęga dwójki to liczba od -1024do +1023). Typ doublemoże łatwo przechowywać liczbę ze setką zer po przecinku:

Kod Wartość zmienna
double a = 2E-300 * 3E+302
600.0


4. Nieskończoność

Liczby zmiennoprzecinkowe mają jeszcze jedną interesującą cechę: pozwalają przechowywać specjalną wartość reprezentującą nieskończoność . Co więcej, może istnieć dodatnia nieskończoność i ujemna nieskończoność .

Przykłady:

Kod Notatka
System.out.println( 100.0 / 0.0 );
Infinity
System.out.println( -100.0 / 0.0 );
-Infinity
double a = 1d / 0d;
double b = a * 10;
double c = b - 100;
a == Infinity
b == Infinity
c == Infinity

Jeśli pomnożysz nieskończoność przez liczbę, otrzymasz nieskończoność. Jeśli dodasz liczbę do nieskończoności, otrzymasz nieskończoność. Bardzo komfortowo.

To nie jest liczba ( NaN)

Wszelkie operacje na nieskończoności dają nieskończoność. Ogólnie tak, ale nie wszystkie.

Liczby zmiennoprzecinkowe mogą przechowywać inną specjalną wartość - NaN. Jest to skrót od Not a Number ( not a number).

W matematyce, jeśli dzielisz nieskończoność przez nieskończoność, musi istnieć niepewność.

Cóż, w Javie, jeśli podzielisz nieskończoność przez nieskończoność, będzie to NaN.

Przykłady:

Kod Notatka
System.out.println(0.0 / 0.0);
NaN
double infinity = 1d / 0d;
System.out.println(infinity / infinity);

NaN
double a = 0.0 / 0.0;
double b = a * 10;
double c = b - 100;
double d = a + infinity;
a == NaN
b == NaN
c == NaN
d == NaN

Każda operacja z NaNdaje NaN.



5. Wpiszchar

Wśród prymitywnych typów w Javie na szczególną uwagę zasługuje jeszcze jeden — typ char. Jego nazwa pochodzi od słowa Char aktor , a sam typ służy do przechowywania znaków.

Ale znaki są dokładnie tym, z czego składają się ciągi: każdy ciąg zawiera tablicę znaków.

Ale jeszcze bardziej interesujący jest fakt, że typ charjest również typem numerycznym ! Można powiedzieć, typ dwufunkcyjny.

Chodzi o to, że w rzeczywistości typ charnie przechowuje znaków, ale kody znaków z kodowania Unicode. Każdemu znakowi odpowiada liczba - numeryczny kod znaku.

Każda zmienna typu charzajmuje dwa bajty w pamięci (podobnie jak type short). Ale w przeciwieństwie do typu short, typ całkowity charjest bez znaku i może przechowywać wartości od 0do 65,535.

Typ charjest typem hybrydowym. Jego wartości można interpretować zarówno jako liczby (można je dodawać i mnożyć), jak i jako symbole. Stało się tak, ponieważ chociaż symbole mają reprezentację wizualną, dla komputera są to przede wszystkim liczby. I znacznie wygodniej jest z nimi pracować, jak z liczbami.

Unikod

Unicode to specjalna tabela (kodowanie), która zawiera wszystkie znaki na świecie. A każdy symbol ma swój własny numer. Wygląda to mniej więcej tak:

Typy pierwotne w Javie

Istnieje wiele sposobów przypisania wartości do zmiennej typu char.

Kod Opis
char a = 'A';
Zmienna аbędzie zawierać literę łacińską А.
char a = 65;
Zmienna аbędzie zawierać literę łacińską А. Jej kod to tylko 65.
char a = 0x41;
Zmienna аbędzie zawierać literę łacińską А.
Jej kod jest dokładnie 65równy 41w systemie szesnastkowym.
char a = 0x0041;
Zmienna аbędzie zawierać literę łacińską А.
Jej kod jest dokładnie 65równy 41w systemie szesnastkowym.
Dwa dodatkowe zera niczego nie zmieniają.
char a = '\u0041';
Zmienna аbędzie zawierać literę łacińską А.
Inny sposób ustawienia znaku według jego kodu.

Najczęściej po prostu oznaczają znak w cudzysłowie (jak w pierwszym wierszu tabeli). Chociaż ta druga metoda jest również popularna. Jego zaletą jest to, że można go używać na stringach.

Jak powiedzieliśmy, typ charjest również typem całkowitym, więc możesz go zapisać w ten sposób:

Kod Wyjście na wyświetlaczu
char a = 'A';
a++;
System.out.println(a);
Na ekranie zostanie wyświetlona litera łacińska B.
Ponieważ:
A- 65
B- 66
C-67

Praca z typemchar

Każdy znak charto przede wszystkim liczba (kod znaku), a następnie znak. Znając kod znaku, zawsze możesz go uzyskać w programie. Przykład:

Kod Wyjście na wyświetlaczu
char c = (char) 1128;
System.out.println(c);

Ѩ

Standardowe kody

Oto najbardziej znane kody znaków:

Symbolika Kody
0, 1, 2, ...9 48, 49, 50, ...57
a, b, c, ...z 97, 98, 99, ...122
A, B, C, ...Z 65, 66, 67, ...90


6. Wpiszboolean

A ostatnim typem pierwotnym jest boolean.

Jak już wiesz, może przyjmować tylko dwie wartości: truei false.

Właściwie wszystko, co możesz wiedzieć o tym typie, już wiesz.