Мазмұнға өту

Аз болса да — күн сайын.

Java OCA 8 frontend-әзірлеушінің көзімен

9 мин оқу

Осы бетте
Қысқаша
Мен Angular мен TypeScript-тегі frontend-әзірлеушімін және Boyarsky мен Selikoff кітабы бойынша Oracle Java SE 8 Programmer I (1Z0-808) сертификаттауына дайындалып жүрмін. Мақсат — Java (Spring) backend бойынша junior/тағылымдамашы сұхбаты. Жазбада — сандармен прогресс, алты тараудың әрқайсысында не бар, TypeScript әдеттері қай жерде қате жауапқа апарады және әр тарауды кодпен бекіту үшін бір-екі LeetCode есебінен. Java мен TypeScript-тің синтаксисі ұқсас, сондықтан ең қулық жерлер — код таныс көрінетін, бірақ басқаша жұмыс істейтін жерлер.

Неге Java және неге осы емтихан

Мақсат — тек frontend емес, Java/Spring-де backend жаза білу. Сертификаттың өзі жұмыс бермейді. Бірақ оған дайындық тілдің негізін «Stack Overflow деңгейінде» емес, ұсақ-түйегіне дейін үйренуге мәжбүрлейді. Емтихан дәл ұсақ-түйекті тексереді: бұл код компиляцияланады ма, не басып шығарады, қандай ерекшелік лақтырады.

Кітап — осы емтиханға арналған ресми Study Guide: 6 тарау, әрқайсысына — емтихан мақсаттарының тізімі, қорытынды және өзін-өзі тексеру сұрақтары. Басында — кіріс тесті, соңында — талдауы бар жауаптар және дайындық бойынша кеңестер.

Сандармен жоспар

Әр тараудың беттері мазмұн бойынша есептеледі: келесі тараудың басы минус ағымдағысының басы.

ТарауТақырыпБеттерКүніне 10 беттен күндер
1Java Building Blocks1–50 → 505
2Operators and Statements51–100 → 505
3Core Java APIs101–164 → 647
4Methods and Encapsulation165–232 → 687
5Class Design233–298 → 667
6Exceptions299–332 → 344
Барлығы33235

Неге 332 / 10 = 33,2 емес, 35? Өйткені күндер тараулар бойынша жоғары қарай дөңгелектеніп есептеледі: 64 бет — 6,4 емес, 7 күн: толық емес күн бәрібір бір күн алады. Дөңгелектеулердің қосындысы: 5 + 5 + 7 + 7 + 7 + 4 = 35. Бұл — жоғары қарай дөңгелектеу (ceil), бағдарламалаудағы Math.ceil(64 / 10) сияқты.

Қазір қай жердемін

332 беттің 271-і оқылды — 5-тараудың ортасы, интерфейстер туралы бөлім.

  • Оқылғаны: 271 / 332 = 0,816 → 82%.
  • Қалғаны: 332 − 271 = 61 бет.
  • Күніне 10 беттен: ⌈61 / 10⌉ = ⌈6,1⌉ = 7 күн → тараулар 16 қарашаға дейін бітеді.

⌈ ⌉ жақшалары — сол жоғары қарай дөңгелектеу: 6,1 күн — бәрібір жеті күнтізбелік күн.

Әрі қарай — «оқыдым да ұмыттым» емес, 1–4-тарауларды LeetCode есептері арқылы қайталау (жоспар төменде) және сынақ тесттері. Мақсат — вакансияларға өтініш беру басталатын желтоқсанға дейін.

Өзін-өзі тексеру ережесі: әр тараудан кейін — Review Questions кеңессіз, нәтиже пайызбен. 65%-дан төмен (емтиханның өту балы) болса — тарау «кейін түсінермін» емес, қайта оқылады.

1-тарау. Java Building Blocks

Не туралы: класс құрылымы, main(), пакеттер мен импорттар, конструкторлар және инициализация реті, примитивтер мен сілтемелік типтер, айнымалылардың көріну аймағы, қоқыс жинағыш.

TypeScript қай жерде кедергі келтіреді:

  • Примитивтер сегіз, және олардың өлшемі тұрақты. TypeScript-те бәріне бір number. Java-да — byte (8 бит), short (16), int (32), long (64), float, double, оған қоса char және boolean. Мәннің сыятыны өлшемге байланысты: byte −128-ден 127-ге дейін сақтайды, өйткені 8 бит 2⁸ = 256 мән береді, жартысы теріс сандарға берілген.
  • Мәні жоқ жергілікті айнымалыны оқуға болмайды. TypeScript-те бұл undefined. Java-да — компиляция қатесі. Ал класс өрістері әдепкі мән алады: 0, false, null.
  • Жұлдызшалы импорт ішкі папкаларға кірмейді. import java.util.*; java.util.concurrent ішіндегі кластарды импорттамайды.

Емтихан тұзағы: объектінің инициализация реті. Алдымен өрістер мен инициализация блоктары — жоғарыдан төмен, жазылған ретімен, — тек содан кейін конструктордың денесі.

public class Order {
    private String name = "поле";
    { System.out.println(name); }          // блок инициализации
    public Order() { name = "конструктор"; System.out.println(name); }
    public static void main(String[] args) { new Order(); }
}
// напечатает: поле, затем конструктор

Менің Review Questions нәтижем: TODO

2-тарау. Operators and Statements

Не туралы: операторлар және олардың басымдығы, есептеу кезіндегі типтерді келтіру, if, switch, циклдер, белгілері бар break және continue.

TypeScript қай жерде кедергі келтіреді:

  • Есептеу кезінде сандар «көтеріледі». byte мен short үстіндегі арифметиканың нәтижесі — әрдайым int. Сондықтан byte a = 1, b = 2; byte c = a + b; компиляцияланбайды: оң жақта int, ал оны byte-ға үнсіз салуға болмайды.
  • Бүтін санды бөлу. Екі сан да бүтін болса, Java-да 7 / 2 — 3.5 емес, 3. JavaScript-те — 3.5.
  • if тек boolean қабылдайды. Ешқандай «ақиқаттық» жоқ: санмен if (count) компиляцияланбайды. JS-тен келген if (value) деп жазу әдеті мұнда — қате.
  • Java 8-дегі switch int және одан кіші типтермен, char, String және enum типтерімен жұмыс істейді, бірақ long және boolean типтерімен емес.

Емтихан тұзағы: бір өрнектегі x++ және ++x. Постфикс ескі мәнді, префикс жаңасын қайтарады:

int x = 3;
int y = x++ + ++x;   // 3 + 5 = 8, а x в итоге 5

Менің Review Questions нәтижем: TODO

3-тарау. Core Java APIs

Не туралы: String және жолдар пулы, StringBuilder, == мен equals() салыстыру, массивтер, ArrayList, орауыштар және автоорау, java.time-тегі күн мен уақыт.

TypeScript қай жерде кедергі келтіреді:

  • Объектілерде == мазмұнды емес, сілтемелерді салыстырады. Мәтіні бірдей екі түрлі жол == бойынша тең болмауы мүмкін. Мазмұнды equals() салыстырады. JS-те жолдардағы === мәндерді салыстырады, сондықтан қол == деп жазады — және жауап қате.
  • Жолдар өзгермейді, JS-тегідей: s.toUpperCase() жаңа жол қайтарады және s-ті өзгертпейді. Нәтижені меншіктемесең — ол жоғалды. Емтихан мұндай кодты жақсы көреді.
  • Массивтің ұзындығы тұрақты. Массивте push жоқ; өсетін тізім үшін — ArrayList.
  • substring(begin, end) end-ты қамтымайды — JS-тегі slice сияқты. Есесіне StringBuilder-да append, insert, delete әдістері объектінің өзін өзгертеді, ал substring — жоқ.
  • Күндер өзгермейді. date.plusDays(1) жаңа күн қайтарады. Меншіктемей шақыру ештеңе істемейді.

Емтихан тұзағы: ArrayList<Integer>-де екі remove әдісі бар: индекс бойынша (int) және объект бойынша (Integer):

List<Integer> list = new ArrayList<>(Arrays.asList(10, 20, 30));
list.remove(1);                    // удалит элемент с индексом 1 → [10, 30]
list.remove(Integer.valueOf(10));  // удалит значение 10 → [30]

Менің Review Questions нәтижем: TODO

4-тарау. Methods and Encapsulation

Не туралы: әдістерді жариялау, қолжетімділік модификаторлары, static, параметрлерді беру, артық жүктеу, конструкторлар, инкапсуляция, өзгермейтін кластар, қарапайым лямбдалар және Predicate.

TypeScript қай жерде кедергі келтіреді:

  • Қолжетімділіктің үш емес, төрт деңгейі. private, модификаторсыз («package-private» — пакет ішінде көрінеді), protected (пакет + мұрагерлер), public. TypeScript-те «пакет ішінде» деңгейі жоқ.
  • Java әрдайым мән бойынша береді. Объектілер үшін мән бойынша сілтеме беріледі. Параметрге жаңа объект меншіктесең — шақырушы мұны көрмейді. Объектінің әдісін шақырсаң — көреді. Бұл JS-тегідей, бірақ емтихан мұны әр қадамда тексереді.
  • Әдістерді артық жүктеу. TypeScript-те артық жүктеулер — тек типтер, функцияның денесі біреу. Java-да бір атаулы бірнеше әдіс — шынымен әртүрлі әдістер, және компилятор керегін таңдайды.

Емтихан тұзағы: артық жүктеуді таңдау реті. Алдымен типтің дәл сәйкестігі, содан кейін примитивті кеңейту (int → long), содан кейін автоорау (int → Integer), және тек содан кейін varargs:

static void print(long x)    { System.out.println("long"); }
static void print(Integer x) { System.out.println("Integer"); }
public static void main(String[] args) { print(5); }   // long: расширение раньше упаковки

Менің Review Questions нәтижем: TODO

5-тарау. Class Design

Не туралы: мұрагерлік, ата-ана конструкторларын шақыру, әдістерді қайта анықтау және жасыру, абстрактілі кластар, default- және static-әдістері бар интерфейстер, полиморфизм және типтерді келтіру.

TypeScript қай жерде кедергі келтіреді:

  • Типтеу құрылымдық емес, номиналды. TypeScript-те объектінің керекті өрістері болса, ол интерфейске сай келеді. Java-да класс тек implements деп айқын жазса ғана сай келеді.
  • Конструктордың бірінші жолы — әрдайым this(...) немесе super(...). Жазбасаң — компилятор super() қояды. Ал ата-анада параметрсіз конструктор болмаса, код компиляцияланбайды.
  • Қайта анықтау және жасыру. Кәдімгі әдіс қайта анықталады: нақты объектінің нұсқасы шақырылады. static-әдіс жасырылады: айнымалы типі бойынша нұсқасы шақырылады. Өрістер де қайта анықталмайды, жасырылады.

Емтихан тұзағы: қайта анықтау ережелері. Мұрагердегі әдістің сигнатурасы сол болуы, қолжетімділігі кем болмауы, жаңа немесе кеңірек тексерілетін ерекшеліктерді жарияламауы керек, ал қайтаратын типі — сол немесе оның ішкі типі.

Менің Review Questions нәтижем: TODO

6-тарау. Exceptions

Не туралы: ерекшеліктер не үшін керек, тексерілетін және тексерілмейтін, try/catch/finally, типтік ерекшеліктер, throw және throws.

TypeScript қай жерде кедергі келтіреді:

  • Тексерілетін ерекшеліктер. TypeScript-те кез келген функция кез келген нәрсені лақтыра алады, ал компилятор үндемейді. Java-да тексерілетін ерекшелікті (RuntimeException емес, Exception мұрагері) не ұстау, не throws ішінде жариялау керек. Әйтпесе код компиляцияланбайды.
  • catch реті маңызды. Ата-ана ерекшелігінің блогы еншілес ерекшелік блогынан жоғары болса — компиляция қатесі: екінші блокқа жету мүмкін емес.
  • finally дерлік әрдайым орындалады, тіпті try ішінде return болса да.

Емтихан тұзағы: throw және throws. throw new X() әдіс ішінде ерекшелік лақтырады; әдіс жариялауындағы throws X оның ұшып шығуы мүмкін екенін ескертеді.

Менің Review Questions нәтижем: TODO

Әр тарауға LeetCode

Кітап тілді үйретеді, ал junior/тағылымдамашы сұхбатында әрдайым дерлік «код жаз» деген есеп береді. Сондықтан әр тарауға — тараудың тақырыбы шынымен керек болатын бір-екі есеп. Саны үшін емес: әр есепті leetcode/ ішінде үлгі бойынша рәсімдеп, confidence және қайталау күнін қоямын.

Шартты белгілер: ✅ шешілді, ⬜ жоспарда. Есептер тараудың тұзағы тек тестте емес, кодта кездесетіндей етіп таңдалған.

ТарауЕсепКүрделілігіНені бекітеді
1. Building Blocks⬜ 7. Reverse Integermediumint 32 бит: асып кету, көбейтуге дейін Integer.MAX_VALUE арқылы тексеру
1. Building Blocks⬜ 9. Palindrome Numbereasyжолға аударудың орнына бүтін санды бөлу / 10 және қалдық % 10
2. Operators⬜ 136. Single NumbereasyXOR (^): a ^ a = 0, a ^ 0 = a — O(1) жадпен шешім
2. Operators⬜ 191. Number of 1 Bitseasyығысулар: теріс сандар үшін >> мен >>> айырмашылығы (JS-те де дәл осындай жұп бар)
3. Core APIs✅ 151. Reverse Words in a StringmediumString өзгермейді, split, StringBuilder
3. Core APIs⬜ 242. Valid Anagrameasyint[26] массиві және char арифметикасы: c - 'a' — бұл сан
3. Core APIs⬜ 1. Two SumeasyHashMap: сұхбаттардағы ең жиі есептердің бірі
4. Methods✅ 206. Reverse Linked Listeasyсілтемелер мән бойынша беріледі: шақырушыда не өзгереді, не өзгермейді
4. Methods✅ 21. Merge Two Sorted Listseasyсол: циклде сілтемелермен жұмыс; қайталау үшін — рекурсиямен қайта жазу
4. Methods⬜ 49. Group AnagramsmediumcomputeIfAbsent(key, k -> new ArrayList<>()) ішіндегі лямбда
5. Class Design✅ 20. Valid ParentheseseasyStack (класс) орнына Deque (интерфейс); Character автоорауы
5. Class Design⬜ 155. Min Stackmediumөз класың: private-өрістер, инкапсуляция, тек керекті жария әдістер
5. Class Design⬜ 232. Implement Queue using Stackseasyберілген API-ды басқа құрылымның үстіне іске асыру
6. Exceptions⬜ 8. String to Integer (atoi)mediumInteger.parseInt не істейді және NumberFormatException-ды қашан лақтырады; шеткі жағдайларды қолмен талдау

Барлығы: 4 шешілді, 10 жоспарда.

Есептерде тексеруге тұратын қулық жерлер

  • Integer және ==. Екі Integer-ді == арқылы салыстыру −128-ден 127-ге дейінгі сандар үшін жұмыс істейді (олар кэштеледі), ал үлкендері үшін бұзылады. 20-есепте менде equals — дұрыс. Бұл сұхбаттағы жиі сұрақ.
  • char — бұл сан. 'b' - 'a' == 1, сондықтан әріптер үшін HashMap орнына int[26].
  • Асып кету үндемейді. Integer.MAX_VALUE + 1 қатесіз теріс сан береді. 7 және 8-есептерде мәні осы.

Қарқын

4 аптада 10 есеп: оқудан кейін аптасына 2–3 есеп, демалыс күндері — next_review күні келген есептерді қайталау.

АптаЕсептер
10–16 қараша5–6-тарауларды оқып бітіру; 155, 232
17–23 қараша7, 9, 136
24–30 қараша191, 242, 1
1–7 желтоқсан49, 8 + 20, 21, 151, 206 қайталау

Кітаптан кейін: Spring backend үшін тағы не керек

OCA кітабы Java Core туралы. Backend-әзірлеуші сұхбатында тағы мыналарды сұрайды:

  • SQL — LeetCode-та SQL 50 жинағы бар; 175 (Combine Two Tables) және 176 (Second Highest Salary) есептерінен бастау: JOIN, LIMIT/OFFSET, NULL.
  • Коллекциялар тереңірек: HashMap іштей, equals/hashCode.
  • Spring Boot: REST API мен дерекқоры бар пет-жоба — ол шешілген есептер санынан маңыздырақ.

Мен қалай оқимын

  • Күніне 10 бет, прогресс — кітап картасында; есептер — leetcode/ ішінде.
  • Кітаптағы әр мысалды көзбен оқымай, қолмен теріп, іске қосамын (javac + java). Емтихан кодтың не істейтінін тексереді, ал бұл тек іске қосқанда көрінеді.
  • Іске қоспас бұрын өз жауабымды жазамын: «компиляцияланады ма? не басып шығарады?». Содан кейін салыстырамын. Қателессем — неге екенін жазамын.
  • Review Questions — кеңессіз, нәтиже кестеге.

Әрі қарай не

Кітаптан кейін — сынақ тесттері және емтиханға жазылу. Содан кейін — Spring Boot және пет-жоба: сертификат тілді тексереді, ал жұмысты сол тілмен не істей алатыныңа береді.