Сәлеметсіз бе! JavaRush арқылы өтіп жатқанда, сіз қарабайыр типтерді бірнеше рет кездестірдіңіз. Міне, олар туралы білетін нәрселердің қысқаша тізімі:
Бірақ мәндерден басқа, типтер жад көлемі бойынша да ерекшеленеді.
Түрдің
- Олар an objectілер емес және жадта сақталған мәнді білдіреді
- Қарапайым түрлердің бірнеше түрлері бар:
- Бүтін сандар -
byte
,short
,int
,long
- Жылжымалы нүкте сандары (бөлшек) -
float
жәнеdouble
- логикалық -
boolean
- Символдық (әріптер мен сандарды көрсету үшін) -
char
- Бүтін сандар -
- Олардың әрқайсысының өзіндік мәндер ауқымы бар:
Қарапайым тип | Жадтағы өлшем | Мәндер ауқымы |
---|---|---|
byte | 8 бит | -128-ден 127-ге дейін |
қысқа | 16 бит | -32768-ден 32767-ге дейін |
таңба | 16 бит | 0-ден 65536-ға дейін |
int | 32 бит | -2147483648-ден 2147483647-ге дейін |
ұзақ | 64 бит | -9223372036854775808 бастап 9223372036854775807 дейін |
жүзу | 32 бит | (2-ден қуатқа -149) дейін ((2-2 қуатқа -23)*2 қуатқа 127) |
қос | 64 бит | (-2-ден 63-тің дәрежесіне) ((2-нің 63-тің дәрежесі) - 1) |
логикалық | 8 (массивтерде пайдаланылғанда), 32 (массив еместерде пайдаланылғанда) | шын немесе жалған |
int
астам алады byte
. A long
- артық short
. Примитивтер алатын жады көлемін ұя салатын қуыршақтармен салыстыруға болады: ұя салатын қуыршақтың ішінде бос орын бар. Ұя салатын қуыршақ неғұрлым үлкен болса, соғұрлым көбірек орын болады. Біз үлкен ұя салатын қуыршақтың ішіне long
кішірекін оңай сала аламыз int
. Бұл оңай сәйкес келеді және сізге қосымша ештеңе жасаудың қажеті жоқ. Java тілінде примитивтермен жұмыс істегенде бұл автоматты түрлендіру деп аталады. Басқа жолмен ол кеңейтім деп аталады. Міне қарапайым кеңейтім мысалы:
public class Main {
public static void main(String[] args) {
int bigNumber = 10000000;
byte littleNumber = 16;
bigNumber = littleNumber;
System.out.println(bigNumber);
}
}
byte
Мұнда айнымалыға мән береміз int
. Тапсырма сәтті және еш қиындықсыз орындалды: ішінде сақталған мән byte
жадта «сәйкестендірілгеннен» азырақ орын алады int
. «Ұя салатын кішкентай қуыршақ» (мән byte
) «үлкен матрешкаға» (айнымалы int
) оңай сәйкес келеді. Керісінше әрекет еткенде, бұл басқа мәселе - мұндай өлшемдерге арналмаған айнымалыға үлкен мән қойыңыз. Негізінде, бұл трюк нақты ұя салатын қуыршақтармен жұмыс істемейді, бірақ Java-да ол жұмыс істейді, бірақ нюанстармен. int
Айнымалыға мән енгізуге тырысайық short
:
public static void main(String[] args) {
int bigNumber = 10000000;
short littleNumber = 1000;
littleNumber = bigNumber;//error!
System.out.println(bigNumber);
}
Қате! Компилятор стандартты емес нәрсе жасауға тырысып жатқаныңызды түсінеді және үлкен матрешка қуыршағын ( int
) кішкентайдың ( short
) ішіне қойыңыз. Бұл жағдайда компиляция қатесі компилятордың ескертуі болып табылады: « Эй, сіз мұны шынымен орындағыңыз келе ме? «Егер сенімді болсаңыз, бұл туралы компиляторға айтыңыз: « Бәрі жақсы, мен не істеп жатқанымды білемін!» ” Бұл процесс анық түр түрлендіру немесе тарылту деп аталады . Тарту жасау үшін мәнді аударғыңыз келетін түрді нақты көрсетуіңіз керек. Басқаша айтқанда, құрастырушының сұрағына жауап беріңіз: « Ал, осы үлкен қуыршақтардың қайсысына салғың келеді?» ” Біздің жағдайда ол келесідей болады:
public static void main(String[] args) {
int bigNumber = 10000000;
short littleNumber = 1000;
littleNumber = (short) bigNumber;
System.out.println(littleNumber);
}
int
Біз мәнді айнымалыға сәйкестендіруді short
және ол үшін жауапкершілікті алғымыз келетінін анық көрсеттік . Құрастырушы тар түрдің айқын көрсеткішін көріп, түрлендіруді орындайды. Нәтиже қандай болады? Консоль шығысы: -27008 Біраз күтпеген. Неліктен дәл осылай? Бұл шын мәнінде қарапайым. int
Бізде бастапқы мән болды - 10000000 Ол 32 бит алатын айнымалыда сақталды , ал екілік түрде ол келесідей болды: Біз бұл мәнді айнымалыға жазамыз short
, бірақ ол тек 16 бит сақтай алады! Тиісінше, біздің нөміріміздің алғашқы 16 биті ғана сонда жылжытылады, қалғандары жойылады. Нәтижесінде, айнымалы short
мәнді қамтиды , ондық түрінде дәл -27008-ге тең, сондықтан компилятор белгілі бір түрге анық трансляция түрінде «растауды сұрады». Біріншіден, бұл нәтиже үшін жауапкершілікті өз мойнына алатыныңызды көрсетеді, екіншіден, түрлерді шығару кезінде компиляторға қанша орын бөлу керектігін айтады. Ақыр соңында, егер біз соңғы мысалда -ға емес, int
type -ге көшкен болсақ , біздің иелікте 16 емес, тек 8 бит болады және нәтиже басқаша болар еді. Бөлшек түрлері ( және ) үшін тарылу басқаша жүреді. Егер мұндай санды бүтін түрге түрлендіруге әрекет жасасаңыз, оның бөлшек бөлігі жойылады. byte
short
float
double
public static void main(String[] args) {
double d = 2.7;
long x = (int) d;
System.out.println(x);
}
Консоль шығысы: 2
Деректер түрі char
Сіз char түрі жеке таңбаларды көрсету үшін қолданылатынын білесіз.public static void main(String[] args) {
char c = '!';
char z = 'z';
char i = '8';
}
Бірақ оның түсіну үшін маңызды бірқатар ерекшеліктері бар. Мән диапазондары бар кестені қайта қарастырайық:
Қарапайым тип | Жадтағы өлшем | Мәндер ауқымы |
---|---|---|
byte | 8 бит | -128-ден 127-ге дейін |
қысқа | 16 бит | -32768-ден 32767-ге дейін |
таңба | 16 бит | 0-ден 65536-ға дейін |
int | 32 бит | -2147483648-ден 2147483647-ге дейін |
ұзақ | 64 бит | -9223372036854775808 бастап 9223372036854775807 дейін |
жүзу | 32 бит | (2-ден қуатқа -149) дейін ((2-2 қуатқа -23)*2 қуатқа 127) |
қос | 64 бит | (-2-ден 63-тің дәрежесіне) ((2-нің 63-тің дәрежесі)-1) |
логикалық | 8 (массивтерде пайдаланылғанда), 32 (массив еместерде пайдаланылғанда) | шын немесе жалған |
char
0-ден 65536-ға дейінгі сандық диапазоны бар. Бірақ бұл нені білдіреді? Өйткені, char
бұл сандар ғана емес, әріптер, тыныс белгілері де... Мәндер char
Java тілінде Юниcode форматында сақталады. Біз Юниcodeты алдыңғы лекциялардың бірінде кездестірдік. Юниcode - әлемнің барлық дерлік жазба тілдеріндегі таңбаларды қамтитын таңбаларды codeтау стандарты екенін есте ұстаған шығарсыз . Басқаша айтқанда, бұл кез келген тілдегі кез келген таңбаның codeы бар арнайы codeтардың тізімі. Жалпы Юниcode кестесі өте үлкен және, әрине, жатқа үйренудің қажеті жоқ. Міне, мысалы, оның бір бөлігі: Ең бастысы - мәндерді сақтау принципін түсіну char
және белгілі бір таңбаның codeын біле отырып, оны әрқашан бағдарламада алуға болатынын есте сақтаңыз. Мұны кездейсоқ санмен қолданып көрейік:
public static void main(String[] args) {
int x = 32816;
char c = (char) x ;
System.out.println(c);
}
Консоль шығысы: 耰 Бұл Java тілінде таңбалар сақталатын пішім char
. Әрбір таңба санға сәйкес келеді - 16 биттік сандық code немесе екі byte. Юниcode 32816 耰 таңбасына сәйкес келеді. Осы сәтке назар аударыңыз. Бұл мысалда біз айнымалыны қолдандық int
. Ол 32 бит жадты алады , ал char
16 . Мұнда біз таңдадық , себебі бізге қажет нөмір 32816 ауқымнан тыс . Өлшем қысқа сияқты 16 бит болса да, ауқымда теріс сандар жоқ, сондықтан «оң» диапазон екі есе үлкен (32767 орнына 65536 ). Біздің codeымыз 65536 ауқымында болған кезде біз пайдалана аламыз . Бірақ егер санды жасасақ , ол 16 биттен көп орын алады. Ал түрлерін тарылтқанда: int
short
char
char
char
short
int
int >65536
char c = (char) x;
қосымша биттер жойылады және нәтиже күтпеген болады.
Символ және бүтін сандарды қосу ерекшеліктері
Осы ерекше мысалды қарастырайық:public class Main {
public static void main(String[] args) {
char c = '1';
int i = 1;
System.out.println(i+c);
}
}
Консоль шығысы: 50 O_O Логика қайда? 1+1, 50 қайдан шықты?! char
Мәндер жадта 0-ден 65536-ға дейінгі диапазондағы сандар ретінде сақталатынын білесіз , бұл біздің кейіпкеріміздің Юниcodeын білдіреді. Солай. Біз қосуды орындаған кезде char
және кейбір бүтін тип char
Юниcodeта оған сәйкес келетін санға түрлендіріледі. Біздің codeта 1 және '1' сандарын қосқанда, '1' символы оның codeына түрлендірілді, ол 49 (оны жоғарыдағы кестеде тексеруге болады). Сондықтан, нәтиже 50-ге тең болды. Мысал ретінде тағы да ескі досымыз -耰алайық және оны бірнеше санмен қосып көрейік.
public static void main(String[] args) {
char c = '耰';
int x = 200;
System.out.println(c + x);
}
Консоль шығысы: 33016 Біз耰32816 codeына сәйкес келетінін білдік. Осы сан мен 200-ді қосқанда, біз дәл нәтиже аламыз - 33016 :) Жұмыс істеу механизмі, көріп отырғаныңыздай, өте қарапайым.
GO TO FULL VERSION