Java OCA 8 frontend-әзірлеушінің көзімен
Осы бетте
Неге Java және неге осы емтихан
Мақсат — тек frontend емес, Java/Spring-де backend жаза білу. Сертификаттың өзі жұмыс бермейді. Бірақ оған дайындық тілдің негізін «Stack Overflow деңгейінде» емес, ұсақ-түйегіне дейін үйренуге мәжбүрлейді. Емтихан дәл ұсақ-түйекті тексереді: бұл код компиляцияланады ма, не басып шығарады, қандай ерекшелік лақтырады.
Кітап — осы емтиханға арналған ресми Study Guide: 6 тарау, әрқайсысына — емтихан мақсаттарының тізімі, қорытынды және өзін-өзі тексеру сұрақтары. Басында — кіріс тесті, соңында — талдауы бар жауаптар және дайындық бойынша кеңестер.
Сандармен жоспар
Әр тараудың беттері мазмұн бойынша есептеледі: келесі тараудың басы минус ағымдағысының басы.
| Тарау | Тақырып | Беттер | Күніне 10 беттен күндер |
|---|---|---|---|
| 1 | Java Building Blocks | 1–50 → 50 | 5 |
| 2 | Operators and Statements | 51–100 → 50 | 5 |
| 3 | Core Java APIs | 101–164 → 64 | 7 |
| 4 | Methods and Encapsulation | 165–232 → 68 | 7 |
| 5 | Class Design | 233–298 → 66 | 7 |
| 6 | Exceptions | 299–332 → 34 | 4 |
| Барлығы | 332 | 35 |
Неге 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-дегі
switchintжәне одан кіші типтермен,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 Integer | medium | int 32 бит: асып кету, көбейтуге дейін Integer.MAX_VALUE арқылы тексеру |
| 1. Building Blocks | ⬜ 9. Palindrome Number | easy | жолға аударудың орнына бүтін санды бөлу / 10 және қалдық % 10 |
| 2. Operators | ⬜ 136. Single Number | easy | XOR (^): a ^ a = 0, a ^ 0 = a — O(1) жадпен шешім |
| 2. Operators | ⬜ 191. Number of 1 Bits | easy | ығысулар: теріс сандар үшін >> мен >>> айырмашылығы (JS-те де дәл осындай жұп бар) |
| 3. Core APIs | ✅ 151. Reverse Words in a String | medium | String өзгермейді, split, StringBuilder |
| 3. Core APIs | ⬜ 242. Valid Anagram | easy | int[26] массиві және char арифметикасы: c - 'a' — бұл сан |
| 3. Core APIs | ⬜ 1. Two Sum | easy | HashMap: сұхбаттардағы ең жиі есептердің бірі |
| 4. Methods | ✅ 206. Reverse Linked List | easy | сілтемелер мән бойынша беріледі: шақырушыда не өзгереді, не өзгермейді |
| 4. Methods | ✅ 21. Merge Two Sorted Lists | easy | сол: циклде сілтемелермен жұмыс; қайталау үшін — рекурсиямен қайта жазу |
| 4. Methods | ⬜ 49. Group Anagrams | medium | computeIfAbsent(key, k -> new ArrayList<>()) ішіндегі лямбда |
| 5. Class Design | ✅ 20. Valid Parentheses | easy | Stack (класс) орнына Deque (интерфейс); Character автоорауы |
| 5. Class Design | ⬜ 155. Min Stack | medium | өз класың: private-өрістер, инкапсуляция, тек керекті жария әдістер |
| 5. Class Design | ⬜ 232. Implement Queue using Stacks | easy | берілген API-ды басқа құрылымның үстіне іске асыру |
| 6. Exceptions | ⬜ 8. String to Integer (atoi) | medium | Integer.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 және пет-жоба: сертификат тілді тексереді, ал жұмысты сол тілмен не істей алатыныңа береді.