Salom! JavaRush orqali o'tayotganda siz ibtidoiy turlarga bir necha marta duch kelgansiz. Mana ular haqida biz bilgan narsalarning qisqa ro'yxati:
Ammo, qiymatlardan tashqari, turlar xotira hajmida ham farqlanadi.
Tur
- Ular ob'ektlar emas va xotirada saqlangan qiymatni ifodalaydi
- Bir necha turdagi ibtidoiy turlar mavjud:
- Butun sonlar -
byte
,short
,int
,long
- Suzuvchi nuqta raqamlari (kasr) -
float
vadouble
- Mantiqiy -
boolean
- Ramziy (harflar va raqamlarni ko'rsatish uchun) -
char
- Butun sonlar -
- Ularning har biri o'ziga xos qiymatlarga ega:
Primitiv tip | Xotiradagi o'lcham | Qiymatlar diapazoni |
---|---|---|
bayt | 8 bit | -128 dan 127 gacha |
qisqa | 16 bit | -32768 dan 32767 gacha |
char | 16 bit | 0 dan 65536 gacha |
int | 32 bit | -2147483648 dan 2147483647 gacha |
uzoq | 64 bit | -9223372036854775808 dan 9223372036854775807 gacha |
suzmoq | 32 bit | dan (2 quvvatga -149) gacha ((2-2 quvvatga -23)*2 quvvatga 127) |
ikki barobar | 64 bit | dan (-2 ning 63 darajasiga) ((2 ning 63 ning darajasiga) - 1) gacha |
mantiqiy | 8 (massivlarda foydalanilganda), 32 (massiv bo'lmaganlarda ishlatilganda) | To'g'ri yoki noto'g'ri |
int
dan ko'proq narsani oladi byte
. A long
- dan ortiq short
. Ibtidoiy qo'g'irchoqlar egallagan xotira hajmini uy qurgan qo'g'irchoqlar bilan taqqoslash mumkin: Uy quradigan qo'g'irchoq ichida bo'sh joy mavjud. Uy quradigan qo'g'irchoq qanchalik katta bo'lsa, shunchalik ko'p joy bo'ladi. long
Kichkinasini osongina katta yuva qo'g'irchog'i ichiga qo'yishimiz mumkin int
. Bu osongina mos keladi va siz qo'shimcha hech narsa qilishingiz shart emas. Java-da primitivlar bilan ishlashda bu avtomatik konvertatsiya deb ataladi. Boshqacha qilib aytganda, u kengaytma deb ataladi. Mana oddiy kengaytma misoli:
public class Main {
public static void main(String[] args) {
int bigNumber = 10000000;
byte littleNumber = 16;
bigNumber = littleNumber;
System.out.println(bigNumber);
}
}
byte
Bu erda biz o'zgaruvchiga qiymat beramiz int
. Topshiriq muvaffaqiyatli va hech qanday muammosiz amalga oshirildi: ichida saqlangan qiymat byte
xotirada "mos keladigan" dan kamroq joy egallaydi int
. "Kichik uyali qo'g'irchoq" (qiymat byte
) "katta matryoshka" (o'zgaruvchan int
) ga osongina mos keladi. Buning teskarisini qilishga harakat qilganingizda, bu boshqa masala - bunday o'lchamlar uchun mo'ljallanmagan o'zgaruvchiga katta qiymat qo'ying. Aslida, bu hiyla haqiqiy uyali qo'g'irchoqlar bilan ishlamaydi, lekin Java-da u ishlaydi, lekin nuanslar bilan. int
Keling, o'zgaruvchiga qiymat qo'yishga harakat qilaylik short
:
public static void main(String[] args) {
int bigNumber = 10000000;
short littleNumber = 1000;
littleNumber = bigNumber;//error!
System.out.println(bigNumber);
}
Xato! Tuzuvchi siz nostandart biror narsa qilmoqchi ekanligingizni tushunadi va int
kichik () ichiga katta matryoshka qo'g'irchog'ini qo'ying ( short
). Bu holatda kompilyatsiya xatosi kompilyatorning ogohlantirishidir: “ Hey, buni qilishni xohlaysizmi? "Agar ishonchingiz komil bo'lsa, bu haqda kompilyatorga ayting:" Hammasi yaxshi, men nima qilayotganimni bilaman!" ” Bu jarayon aniq turdagi konvertatsiya deb ataladi, yoki toraytirish . Toraytirish uchun siz o'z qiymatingizni qaysi turga kiritmoqchi ekanligingizni aniq ko'rsatishingiz kerak. Boshqacha qilib aytganda, kompilyatorning savoliga javob bering: " Xo'sh, bu katta qo'g'irchoqni qaysi qo'g'irchoqqa qo'ymoqchisiz?" ” Bizning holatimizda u quyidagicha ko'rinadi:
public static void main(String[] args) {
int bigNumber = 10000000;
short littleNumber = 1000;
littleNumber = (short) bigNumber;
System.out.println(littleNumber);
}
int
Biz qiymatni o'zgaruvchiga moslashtirmoqchi ekanligimizni short
va buning uchun javobgarlikni o'z zimmamizga olishni aniq ko'rsatdik. Kompilyator torroq turdagi aniq ko'rsatmani ko'rib, konversiyani amalga oshiradi. Natija qanday bo'ladi? Konsol chiqishi: -27008 Bir oz kutilmagan. Nega aynan shunday? Bu aslida oddiy. int
Bizda asl qiymat bor edi - 10000000 U 32 bitni egallagan o'zgaruvchida saqlangan va ikkilik shaklda u shunday ko'rinardi: Biz bu qiymatni o'zgaruvchiga yozamiz short
, lekin u faqat 16 bitni saqlashi mumkin! Shunga ko'ra, bizning raqamimizning faqat birinchi 16 biti u erga ko'chiriladi, qolganlari o'chiriladi. Natijada, o'zgaruvchi o'nlik ko'rinishda -27008 ga to'liq teng bo'lgan short
qiymatni o'z ichiga oladi , shuning uchun kompilyator ma'lum bir turga aniq uzatish shaklida "tasdiqlashni so'radi". Birinchidan, bu sizning natija uchun mas'uliyatni o'z zimmangizga olishingizni ko'rsatadi, ikkinchidan, kompilyatorga turlarni quyishda qancha joy ajratish kerakligini aytadi. Axir, agar oxirgi misolda ga emas, balki int
type ga aylantirganimizda , bizning ixtiyorimizda 16 emas, atigi 8 bit bo'lar edi va natija boshqacha bo'lar edi. Fraksiyonel turlar uchun ( va ), torayish boshqacha sodir bo'ladi. Agar siz bunday sonni butun son turiga aylantirmoqchi bo'lsangiz, uning kasr qismi o'chiriladi. byte
short
float
double
public static void main(String[] args) {
double d = 2.7;
long x = (int) d;
System.out.println(x);
}
Konsol chiqishi: 2
Ma'lumotlar turi char
Siz allaqachon bilasizki, char turi individual belgilarni ko'rsatish uchun ishlatiladi.public static void main(String[] args) {
char c = '!';
char z = 'z';
char i = '8';
}
Lekin u tushunish uchun muhim bo'lgan bir qator xususiyatlarga ega. Keling, qiymat diapazonlari bilan jadvalga yana qaraylik:
Primitiv tip | Xotiradagi o'lcham | Qiymatlar diapazoni |
---|---|---|
bayt | 8 bit | -128 dan 127 gacha |
qisqa | 16 bit | -32768 dan 32767 gacha |
char | 16 bit | 0 dan 65536 gacha |
int | 32 bit | -2147483648 dan 2147483647 gacha |
uzoq | 64 bit | -9223372036854775808 dan 9223372036854775807 gacha |
suzmoq | 32 bit | dan (2 quvvatga -149) gacha ((2-2 quvvatga -23)*2 quvvatga 127) |
ikki barobar | 64 bit | dan (-2 ning 63 darajasiga) dan ((2 ning 63 darajasiga)-1) gacha |
mantiqiy | 8 (massivlarda foydalanilganda), 32 (massiv bo'lmaganlarda ishlatilganda) | To'g'ri yoki noto'g'ri |
char
0 dan 65536 gacha bo'lgan sonli diapazonga ega. Lekin bu nimani anglatadi? Axir char
bular nafaqat raqamlar, balki harflar, tinish belgilari ham... Gap shundaki, qiymatlar char
Java-da Unicode formatida saqlanadi. Oldingi ma'ruzalardan birida biz Unicode bilan uchrashganmiz. Esingizda bo'lsa kerak, Unicode - bu dunyoning deyarli barcha yozma tillaridagi belgilarni o'z ichiga olgan belgilar kodlash standarti. Boshqacha qilib aytganda, bu har qanday tildan deyarli har qanday belgi uchun kod mavjud bo'lgan maxsus kodlar ro'yxati. Umumiy Unicode jadvali juda katta va, albatta, yoddan o'rganish shart emas. Bu erda, masalan, uning bir qismi: Asosiysi, qadriyatlarni saqlash tamoyilini tushunish char
, va esda tutingki, ma'lum bir belgining kodini bilib, uni har doim dasturda olishingiz mumkin. Keling, buni tasodifiy raqam bilan sinab ko'raylik:
public static void main(String[] args) {
int x = 32816;
char c = (char) x ;
System.out.println(c);
}
Konsol chiqishi: Bu Java-da belgilar saqlanadigan formatdir char
. Har bir belgi raqamga mos keladi - 16 bitli raqamli kod yoki ikki bayt. Unicode 32816 zhi belgisiga mos keladi. Ushbu daqiqaga e'tibor bering. Ushbu misolda biz o'zgaruvchidan foydalandik int
. Xotirada 32 bit , char
16 bitni egallaydi . Bu erda biz tanladik , chunki bizga kerak bo'lgan raqam 32816 diapazondan tashqarida . Garchi o'lcham , qisqa bo'lgani kabi, 16 bit bo'lsa-da, diapazonda salbiy raqamlar yo'q, shuning uchun "ijobiy" diapazon ikki baravar katta (32767 o'rniga 65536 ). Kodimiz 65536 oralig'ida bo'lsa, biz dan foydalanishimiz mumkin. Lekin agar biz raqam yaratsak , u 16 bitdan ko'proq vaqtni oladi. Va turlarni qisqartirganda: int
short
char
char
char
short
int
int >65536
char c = (char) x;
qo'shimcha bitlar tashlanadi va natija juda kutilmagan bo'ladi.
Belgi va butun sonlarni qo'shish xususiyatlari
Keling, ushbu noodatiy misolni ko'rib chiqaylik:public class Main {
public static void main(String[] args) {
char c = '1';
int i = 1;
System.out.println(i+c);
}
}
Konsol chiqishi: 50 O_O Mantiq qayerda? 1+1, 50 qayerdan paydo bo'ldi?! Siz allaqachon bilasizki, qiymatlar char
xotirada 0 dan 65536 gacha bo'lgan raqamlar sifatida saqlanadi, bu bizning xarakterimizning Unicode kodini anglatadi. Demak, bu yerda. Biz qo'shishni amalga oshirganimizda char
va ba'zi bir butun son turi char
Unicode'da unga mos keladigan raqamga aylantiriladi. Kodimizga 1 va '1' qo'shganimizda, '1' belgisi uning kodiga aylantirildi, ya'ni 49 (siz buni yuqoridagi jadvalda tekshirishingiz mumkin). Shunday qilib, natija 50 ga teng bo'ldi. Keling, yana bir bor eski do'stimizni misol qilib olaylik va uni qandaydir raqam bilan qo'shishga harakat qilaylik.
public static void main(String[] args) {
char c = '耰';
int x = 200;
System.out.println(c + x);
}
Konsol chiqishi: 33016 32816 kodiga to'g'ri kelishini allaqachon aniqladik. Bu raqam va 200 ni qo'shsak, biz aniq natijaga erishamiz - 33016 :) Ishlash mexanizmi, siz ko'rib turganingizdek, juda oddiy.
GO TO FULL VERSION