
1. Data Structures & Algorithms
1.1. Arrays
1.1.1. Độ dài cố định
1.2. Complexity Algorithm (Big O)
1.2.1. O(1), O(n), O(log n), O(n²), O(n log n),...
1.3. Stacks & Queues
1.3.1. Stack (LIFO) : push, pop, peek,...
1.3.2. Queue (FIFO): add, remove, peek,...
1.4. Search Algorithms
1.4.1. Liner search: duyệt phần tử từ đầu đến cuối (mảng chưa được sắp xếp)
1.4.2. Binary search: chia đôi mảng rồi so sánh (mảng đã được sắp xếp)
1.5. Sorting Algorithms
1.5.1. Bubble sort: lặp đi lặp lại việc so sánh cặp liền kề, sai thì đổi chỗ
1.5.2. Selection sort: chọn phần tử nhỏ nhất đưa về đầu rồi đệ quy với dãy ít hơn 1 phần tử
1.5.3. Insertion sort: tìm cách chèn phần tử vào vị trí ở giữa 2 phần tử khác tạo thành dãy 3 phần tử được sắp xếp
2. Collections Framework
2.1. List, Set, Stack, Queue, PriorityQueue
2.1.1. List: lưu trữ nhóm phần tử có thứ tự, có thể trùng nhau
2.1.2. Set: lưu trữ các phần tử không trùng nhau
2.1.3. Stack: xử lý phần tử dạng LIFO
2.1.4. Queue: xử lý phần tử dạng FIFO
2.1.5. PriorityQueue: xử lý phần tử theo dạng ưu tiên
2.2. ArrayList, LinkedList
2.2.1. ArrayList: mảng - truy cập nhanh - thêm, xóa chậm
2.2.2. LinkedList: node, next - truy cập chậm - thêm xóa nhanh
2.3. Map, Tree
2.3.1. Map: key-value, key không được trùng nhau, các loại (HashMap, TreeMap, LinkedHashMap
2.3.2. Tree: key được sắp xếp tự động, dùng cây nhị phân cân bằng (Red-Black Tree)
2.4. Iterators
2.4.1. Duyệt phần tử trong Collection, next(), hasNext(), remove(),...
3. Input & Output (I/O)
3.1. Text File I/O
3.1.1. Đọc: FileReader, BufferedReader
3.1.2. Ghi: FileWriter, BufferedWriter
3.1.3. Dùng cho văn bản (Text)
3.2. Binary File I/O & Serialization
3.2.1. Đọc: FileInputStream, ObjectInputStream
3.2.2. Ghi: FileOutputStream, ObjectOutputStream
3.2.3. Serialization: interface đánh dấu object có thể ghi file, không có phương thức
3.2.4. Đối tượng ghi/đọc phải implements Serializable
3.2.5. Dùng cho dữ liệu nhị phân, object
4. Testing & Refactoring
4.1. Clean Code
4.1.1. Đặt tên đúng quy tắc, hằng số, tách phương thức, phương thức ngắn gọn
4.2. Test-Driven Development (TDD)
4.2.1. Viết test (test fail) -> Viết code (test pass) -> Refactor code
4.3. JUnit Testing
4.3.1. Framework để test tự động trong Java.
4.3.2. @Test: đánh dấu hàm kiểm thử
4.3.3. assertEquals(expected, actual): kiểm tra kết quả
5. Java Basic
5.1. Introduction to Java
5.1.1. Java: OOP, đa nền tảng, bảo mật
5.1.2. JVM: Chạy bytecode
5.1.3. JRE: Chạy Java app
5.1.4. JDK: Công cụ dev (javac, java,...)
5.1.5. Công cụ: IDE, Terminal, JDK,...
5.2. Operator
5.2.1. Số học: + - * / %
5.2.2. Gán nâng cao: +=, -=, *=, /=
5.2.3. Tăng giảm: ++a, --a, a++, a--
5.2.4. Logic: &&, ||, !,...
5.2.5. Quan hệ: ==, !=, >, <,...
5.3. Control Structures
5.3.1. if - else
5.3.2. if lồng nhau
5.3.3. switch - case
5.4. Variables & Data Types
5.4.1. Kiểu: int, double, boolean, String
5.4.2. Khai báo: clean code
6. Object-Oriented Programming
6.1. Classes & Objects
6.1.1. Class: bản thiết kế của Object, chứa thuộc tính và phương thức
6.1.2. Objects: thực thể của Class, khởi tạo bằng từ khóa new
6.2. Constructors
6.2.1. Phương thức đặc biệt khi khởi tạo đối tượng
6.2.2. Tên giống tên lớp và không có kiểu trả về
6.3. Methods (Instance, Static)
6.3.1. Instance: thuộc đối tượng, cần tạo đôi tượng mới để gọi phương thức
6.3.2. Static: thuộc lớp, không cần tạo đối tượng, chỉ truy cập các thuộc tính static của phương thức
6.4. Inheritance: Superclass, Subclass
6.4.1. Kế thừa cho phép một lớp subclass kế thừa các thuộc tính và phương thức từ một lớp superclass.
6.4.2. Giúp tái sử dụng code và tổ chức mã hiệu quả hơn.
6.4.3. Superclass: lớp cha, cung cấp thuộc tính và phương thức
6.4.4. Subclass: lớp con, kế thừa và có thể ghi đè
6.5. Abstract Classes & Interfaces
6.5.1. Abstract Classes
6.5.1.1. Không thể khởi tạo
6.5.1.2. Chứa được cả phương thức trừu tượng và cụ thể
6.5.1.3. Định nghĩa mẫu cho các lớp con ghi đè
6.5.2. Interfaces
6.5.2.1. Chỉ chứa khai báo phương thức (public abstract)
6.5.2.2. Không thể chứa thuộc tính (trừ static và final)
6.5.2.3. Lớp có thể implements nhiều interfaces (đa kế thừa)
6.6. Access Modifiers
6.6.1. Public: truy cập từ bất cứ đâu
6.6.2. Private: chỉ truy cập trong lớp khai báo
6.6.3. Proceted: có thể truy cập trong subclass hoặc cùng package
6.6.4. Default
6.6.4.1. Mặc định nếu không khai báo access modifier
6.6.4.2. Chỉ có thể truy cập trong cùng gói (package)
7. Advanced Java Concepts
7.1. Static Members
7.1.1. Static Members là các thành phần thuộc về lớp, không phải đối tượng (instance)
7.1.2. Được chia sẻ giữa tất cả các đối tượng của lớp
7.1.3. Static Methods
7.1.3.1. Không cần đối tượng để gọi
7.1.3.2. Không thể truy cập thành viên instance
7.1.4. Static Variables
7.1.4.1. Biến chung cho tất cả các đối tượng của lớp
7.1.4.2. Nếu thay đổi trong một đối tượng, tất cả các đối tượng khác cũng thay đổi
7.2. Encapsulation
7.2.1. Encapsulation: ẩn thuộc tính, truy cập qua getter/setter
7.2.2. Getter: lấy giá trị thuộc tính
7.2.3. Setter: gán giá trị cho thuộc tính
7.3. Polymorphism
7.3.1. Polymorphism cho phép một phương thức hoặc đối tượng có thể hành xử theo nhiều cách khác nhau
7.3.2. Overloading: cùng tên phương thức, khác tham số
7.3.3. Overriding: cùng tên và kiểu phương thức, thay đổi hành vi trong lớp con
7.4. Exception Handling
7.4.1. Try-catch-finally
7.4.1.1. Try: Đặt mã có thể gây lỗi
7.4.1.2. catch: Xử lý lỗi nếu có, có thể có nhiều hoặc không có
7.4.1.3. finally: Mã luôn được thực thi, dù có lỗi hay không
7.4.2. Throws, throw
7.4.2.1. Throws: Dùng để né ngoại lệ
7.4.2.2. Throw: Dùng để ném một ngoại lệ
7.4.3. Custom Exceptions
7.4.3.1. Tạo ngoại lệ riêng bằng cách kế thừa lớp Exception hoặc RuntimeException
7.5. Debugging Techniques
7.5.1. Breakpoints: dừng chương trình tại điểm xác định để kiểm tra
7.5.2. Step Over: Tiến tới dòng tiếp theo mà không vào phương thức
7.5.3. Step Into: Đi vào phương thức để kiểm tra chi tiết