Please enable JavaScript.
Coggle requires JavaScript to display documents.
Module 2 - Coggle Diagram
Module 2
Java là ngôn ngữ lập trình hướng đối tượng OOP
- Ưu điểm: có thể chạy trên nhiều thiết bị
- Nhược điểm: trừu tượng và phức tạp
- JDK : java development kit, là bộ công cụ giúp phát triển và biên dịc mà java thành chương trình java, trong JDK có trình biên dịch, JRE và debugger.
- JRE: java runtime eviroment, môi trường thực thi, trong JRE có JVM giúp thông dịch file java bytecode thành ngôn ngữ máy, ngoài ra còn có thư viện
- JDK sẽ compile file java thành file bytecode(đuôi class), sau đó đến JRE, JVM sẽ thông dịch file bytecode thành ngôn ngữ máy để chạy.
Các kiểu dữ liệu
Kiểu nguyên thủy
- Kiểu số nguyên: byte, short, int, long
- Kiểu số thực: float, double
- Kiểu boolean (mặc định false)
- Kiểu char( mặc định \u0000)
-
-
Các toán tử:
- Toán tử số học + - * / %
- Toán tử so sánh < > <= >= == !=
- Toán tử logic && ||
- Toán tử gán = += -= *= /=
- Toán tử 1 ngôi + - ++ --.
Câu lệnh điều khiển
- câu lệnh if, if else, if bậc thang:
- có thể so sanh điều kiện < > = , biểu thức điều kiện phải có kiểu dữ liệu boolean, mỗi lần chỉ so sánh điều kiện, chạy 1 khối lệnh
- câu lệnh switch case:
- chỉ so sánh bằng, có thể so sánh với nhiều biểu thức khác nhau, có thể chạy nhiều khối lệnh nếu ko có break, biểu thức điều kiện có thể thuộc nhiều kiểu dữ liệu( ko dùng số thực)
DSA danh sách
- Collection là 1 tập hợp 1 nhóm các đối tượng
- Java Collection Framework là 1 khuôn khổ cung cấp các kiến trúc (interface, class, abstract class) để lưu trữ dữ liệu và thao tác với các nhóm dữ liệu( CRUD ), tìm kiếm.
- Set lưu các phần tử không trùng nhau
- List là 1 cấu trúc dữ liệu tuyến tính, các phần tử lưu theo 1 thứ tự nhất định.
- Queue(hàng đợi) thực hiện theo cơ chế vào trước ra trước.
- ArrayList: là 1 class được implement dựa trên mảng, có thể thay đổi kích thước và có các phương thức hỗ trợ như add(), get(), remove(), indexOf().
- Đặc điểm: Truy xuất ngẫu nhiên nhanh( qua index), thêm xóa chậm(vì phải dịch chuyển các phần tử), update nhanh
- LinkedList: là 1 class list hoạt động dựa trên node(cấu trúc dữ liệu dạng danh sách liên kết)
- Đặc điểm: truy xuất ngẫu nhiên chậm(vì phải duyệt từ đầu đến phần tử cần tìm), thêm xóa nhanh( vì chỉ cần thay đổi tham chiếu của node)
+Set: lưu các phần tử không trùng lặp:
- HashSet: lưu theo mã băm
- LinkedHashSet: lưu theo mã băm nhưng duy trì thứ tự nhập vào
- TreeSet :sắp xếp theo thứ tự tăng dần các giá trị(theo ACII)
- Collection là 1 interface lớn nhất
- Collections là 1 class cung cấp các tiện ích, tiêu biểu là hàm sort()
- Iterator: chủ yếu dùng để duyệt
Exception và debug
bug : là lỗi hay hỏng hóc trong chương trình hoặc hệ thống máy tính khiến nó tạo ra kết quả không mong muốn hoặc hành xử theo cách ko thể lường trước được
Exception: là sự kiện bất thường xảy ra trong quá trình thực thi chương trình java, nó phá hỏng luồng thực thi của chương trình hoặc thậm chí gây chết chương trình
- Phân loại Exception:
- Checked Exception: xảy ra trong quá trình compile, bắt buộc phải xử lý, vd FileNotFoundException, IOExeption
- Unchecked Exception: xảy ra trong quá trình runtime, không bắt buộc phải xử lý. vd NumberFormatException, NullPointerException, ArrayIndexOfBoundException
Error là những lỗi cực kì nghiêm trọng liên quan đến môi trường thực thi của ứng dụng mà dev không thể kiểm soát hết được, lỗi này gây chết chương trình và không thể xử lý. vd OutOfMemoryError, StackOverFlowError
- Handle: dùng try -catch-finally hoặc throw và throws
try-catch: tại 1 thời điểm chỉ xảy ra 1 ngoại lệ và chỉ có 1 catch được thực thi, khối finally luôn thực thi dù có ngoại lệ hay không, khối try có thể có 1 hoặc nhiều catch và chỉ có 1 finally. các khối catch phải được xếp từ cụ thể đến chung nhất
- throw: ném 1 ngoại lệ rõ ràng, sau throw là 1 instance , sử dụng trong phương thức, không thể throw nhiều exception.
- throws: dùng để khai báo 1 ngoại lệ, có thể khai báo nhiều ngoại lệ, throws được khia báo ngay sau dấu() của phương thức,
SOLID
S - Single responsibility principle
- Nguyên lí trách nhiệm duy nhất
- Lí do: dễ quản lí mã nguồn, các lớp tập trung vào nhiệm vụ chính của mình
- giảm tính phụ thuộc các thành phần
- Có thể phát triển đồng thời các lớp độc lập với nhau
- Dễ dàng mở rộng và bảo trì
O - Open/closed principle:
• Nguyên lý Đóng-mở
Có thể thoái mái mở rộng một lớp, nhưng không được sửa đổi bên trong lớp đó.
- lí do: dễ mở rộng và thay đổi
L - Liskov substitution principle
• Nguyên lý Thay thế Liskov
- Trong 1 chương trình, các object lớp con có thể thay thế object lớp cha mà không làm thay đổi tính đúng đắn của chương trình.
- Lí do: Tránh các sai sót khi mở rộng thiết kế
I - Interface segregation principle
• Nguyên lý Phân tách Interface
- Thay vì dùng một interface lớn, ta nên tách thành nhiều interface nhỏ, với nhiều mục đích cụ thể.
- Lí do: tránh dư thừa mã nguồn không cần thiết.
D - Dependency inversion principle
• Nguyên lý Đảo ngược Phụ thuộc
- Interface(Abstraction) không nên phụ thuộc vào chi tiết, mà ngược lại (Các lớp giao tiếp với nhau thông qua interface, không phải thông qua triển khai.)
Static, access modifier
- Từ khóa static dùng để khai báo thuộc tính, phương thức, khối lệnh của class và được sự quản lý của class.
- Truy xuất các thành phần static thông qua tên class hoặc qua đối tượng của class đó
- Mục đích định nghĩa các phương thức và thuộc tính chung của các đối tượng, tạo các tiện ích(vd Math)
- Ràng buộc static:
- Phương thức static chỉ có thể gọi phương thức static khác.
- Phương thức static chỉ có thể truy cập các thuộc tính static
- Chỉ có thể khởi tạo các giá trị biến Static thông qua khối lệnh static hoặc gán trực tiếp khi khai báo
- Các loại biến:
- Biến toàn cục(global) : khai báo bên trong class, bên ngoài các constructor, ngoài phương thức
- Biến cục bộ(local) khai báo bên trong constructor, trongn phương thức.
- Biến static: khai báo bằng từ khóa static
- Access modifier:
- private: chỉ dùng bên trong lớp
- default dùng trong package
- protected: dùng trong pakage và lớp con
- public: dùng ở bất cứ đâu
Genetic, Stack và Queue
Generic
- Generic là cơ chế cho phép sử dụng kiêu dữ liệu như tham số(tham số hóa kiểu dữ liệu)
- Generic cho phép tạo ra các class, method, interface hoạt động trên nhiều kiểu dữ liệu khác nhau.
- Ưu điểm: Phát hiện lỗi ở thời điểm biên dịch, không cần ép kiểu(đã xách định KDL), xây dựng các thuật toán tồng quát để tái sử dụng mã nguồn
- Nhược điểm: kiểu dữ liệu object(ko có nguyên thủy, phải dùng wrapper class), không thể dùng static cho thuộc tính, ko thể return về generic trong phương thức, không thể overload các hàm trong 1 lớp, ko thể tạo instance của KDL generic
- Stack: cấu trúc ngăn xếp, vào trước ra sau.
- Các phương thức: push() thêm phần tử, peek() lấy ra phần tử nhưng không xóa, pop() lấy ra phần tử và xóa
- Queue: cấu trúc dữ liệu danh sách hàng đợi, theo quy tắc vào trước ra trước.
- Queue là 1 interface, vì vậy khi sử dụng phải dùng các class implement nó:
- ArrayDequeue: theo cơ chế mảng
- LinkedList: cơ chế danh sách liên kết
- PriotyQueue: sắp xếp từ nhỏ đến lớn
- Comparable: dùng để so sanh mặc định 1 thuộc tính của class(mặc định có trong treeset, PriotyQueue, TreeMap, Collection.sort().
- Comparator: với mỗi class implement comparator có thế so sánh theo một thuộc tính khác nhau, cách sử dụng collection.sort(list, new comparatorClass)
Thuật toán sắp xếp
-
Selection Sort
tìm ra phần tử nhớ nhất hoặc lớn nhất trả về vị trí ban đầu, loại bỏ phần tử đó ra khỏi mảng sắp xếp, lăp lại
Insertion Sort
chia ra 2 mảng, 1 mảng đã sắp xếp, 1 mảng chưa sắp xếp, lấy phần tử bên mảng chưa sắp xếp chền vào vị trí thích hợp bên mảng đã sắp xếp
Sử dụng:
- nếu đã sắp xếp, chèn thêm 1 phần tử thì dùng bublesort hoặc insertionSort
- nếu đã sắp xếp theo chiều ngược lại: dùng SelectionSort
Array:
- Có độ dài cố định
- Các phần tử cùng kiểu dữ liệu
- Truy xuất thông tin qua index
- datatype[] name hoặc datatype name[]
- Khởi tạo trưc tiếp = {1,2,3} hoặc bằng từ khóa new = new datatype[n], mảng có n phần tử rỗng.
Loop
- for: dùng khi biết trước số lần lặp
- while: không biết trước số lần lặp
- do while : thực hiện ít nhất 1 lần dù điều kiện sai ngay từ đầu
For index có thể duyệt xuôi, ngược, từ vị trí bất kì, có thể thay đổi vùng nhớ
For each chỉ duyệt từ đầu đến cuối mảng, và không thay đổi vùng nhớ
ép kiểu ngầm định: từ kiểu nhỏ sang lớn, từ kiểu số nguyên sang số thực
ép kiểu tường mình từ số thực sang số nguyên, có thể mất mát dữ liệu
Clean code
- Clean code là mã sạch: dễ đọc hiểu, đơn giản, dễ phát triển mở rộng, không trùng lặp, thể hiện được ý tưởng thiết kế, định danh thể hiện rõ ý nghĩa, ít sự phụ thuộc.
- Smell code: ngược lại với clean code, khó đọc hiểu đặt tên ko rõ nghĩa,trùng lặp, phương thức quá dài, xử lí quá nhiều việc, lạm dụng comment, phương thức quá nhiều tham số
- Cách đặt tên:
- Không đặt tên quá dài, đặt tên có ý nghĩa, phát âm được, không viết tắt, không mã hóa, phân biệt rõ ràng ý nghĩa các tên, sử dụng đúng ngữ nghĩa
- Tên lớp phải viết hoa chữ đầu, bắt đầu bàng danh từ
- Tên phương thức băt đầu bằng động từ, đặt theo camelCase
- Refactoring: là kĩ thuật giúp tái cấu trúc mã nguồn nhưng vẫn đảm bảo tính đúng đắn của chương trình, có các refactor đổi tiên biến, tách biến, tách hằng, tách phương thức.
- Tìm kiếm tuyến tính(LinearSearch): tất cả các phần tử đều được kiểm tra, nếu tìm thấy thì trả về index của nó, nếu ko có trả về -1. độ phức tạp O(n)
- Tìm kiếm nhị phân(BinarySearch): yêu cầu phải được sắp xếp tăng dần hoặc giảm dần.
- so sánh phần từ cần tìm với phần tử giữa mảng, nếu bằng trả về index
- nếu lớn hơn mid, thì tìm mảng bên phải, ngược lại tìm mảng bên trái, lặp lại bước 1
Độ phức tạp của thuật toán: là thời gian thực hiện số phép tính của thuật toán với bộ dữ liệu đầu vào kích thước n, vd vòng lặp n phần tử thì độ phức tạp O(n)
String và regex
+String là chuỗi văn bản trong java, dùng để lưu trữ, làm việc. có 2 cách khởi tạo. khởi tạo kiểu nguyên thủy và khởi tạo kiểu object bằng từ khóa new
- Khai báo kiêu nguyên thủy: chuỗi được lưu vào vùng string pool trong heap. nếu string pool đã có chuỗi đó thì biến đó sẽ tham chiếu đến chuỗi đó
- Khai báo kiểu object: chuỗi lưu vào vùng nhớ heap, và kiểm tra trong string pool nếu chưa có chuỗi đó thì lưu chuỗi đó vào string pool
- String là immutable(bất biến)
- Các phương thức thường dùng: concat(), length(), trim(), replace(), subString().
- StringBuilder: hỗ trợ bất đồng bộ, không an toàn
- StringBuffer: hỗ trợ đồng bộ, an toàn.
- Các phương thức : append() thêm, insert() chèn vào vị trí, delete() xóa kí tự hoặc chuỗi, reverse() đảo ngược chuỗi, toString() chuyển StringBuilder thành String
Regex là chuỗi dùng để quy định dạng thức của 1 chuỗi khác, dùng để validate và tìm kiếm.
- có 3 class:
- Pattern : khai báo regex
- Matcher: dùng để so khớp
- PatternSytaxException ném ngoại lệ
vd:
- X*: xuất hiện 0 hoặc nhiều X
- X+ xuất hiện 1 hoặc nhiều X
- X{n} X xuất hiện n lần
- X{n,m} X xuất hiện ít nhất n lần, nhiều nhất m lần
- Khái niệm: là tập hợp các câu lệnh để thực hiện 1 nhiệm vụ nào đó, dùng để tái sử dụng mã nguồn
- Khai báo: modifier (static, final) returnType name(p1,p2.){ statemen}
- Java 100% tham trị, không hỗ trợ tham chiếu
Đệ quy: phương thức gọi lại chính nó, không nên dùng vì tốn vùng nhớ, nên thay bằng vòng lặp
Khi kết thúc hàm, bộ nhớ stack được giải phóng
Class và Object
OOP
- OOP là kĩ thuật đưa các đối tượng trong thực tế vào ngôn ngữ lập trình.
- Ưu điểm: dễ bảo trì, mở rộng và tái sử dụng mã nguồn cao giúp giảm chỉ phí
- Nhược điểm: trừu tượng
Class
- Class là một khuôn mẫu định nghĩa các thuộc tính và phương thức chung của các đối tượng cùng loại
- Khai báo bằng từ khóa class
- Chỉ khai báo được 1 lần trong 1 package
Contrucstor
- Constructor là 1 phương thức đặc biệt dùng để khởi tạo đối tượng
- Trong java có thể tạo nhiều constructor, tên constructor phải trùng với tên class, constructor không có kiêu dữ liệu trả về.
- Nếu không có constructor thì java mặc định tạo 1 constructor không tham số, khi tạo các constructor thì constructor mặc định đó sẽ mất đi
- Có thể gọi 1 constructor khác bằng từ khóa this, dòng gọi phải nằm đầu tiên và chỉ gọi được 1 constructor khác
- Từ khóa this giúp truy cập các thuộc tính của đối tượng hiện tại.
Map
- Map sử dụng để lưu trữ và truy xuất theo cặp key/value.
- Map không thuộc collection
- Mỗi cặp key/value là 1 entry
- Mỗi key sẽ tương ứng với 1 value
- Value có thể bằng hoặc khác nhau.
- Các class triển khai Map:
- HashMap: lưu và truy xuất qua key/value, các key không trùng nhau, có thể có 1 key null, có thể có nhiều giá trị null, không duy trì thứ tự nhập vào
- LinkedHashMap: như hashMap nhưng duy trì thứ tự nhập vào
- TreeMap: như hashMap nhưng sắp xếp các key từ nhỏ đến lớn, các key không được null. Lưu ý với key là object thì object đó phải implement comparable.
IO Text File
- Stream là hoạt động nhập xuất dữ liệu:
- Character stream được thiết kế để hỗ trợ nhập xuất dữ liệu theo kí tự Unicode
- Byte stream: hỗ trợ nhập xuất dữ liệu theo byte(đọc ghi dữ liệu nhị phân)
- Các class triển khai:
- Abstract class: Reader, Writer
- Class triển khai: FileReader, BufferReader, FileWriter, BufferWriter
-
- Binary Tree: lưu dữ liệu vào các node, các node có mối quan hệ cha con, node trên cùng là root, mỗi node có 0,1,2 cây con, 2 cây con lần lượt gọi là left-subtree và right-subtree
- Binary Search Tree: giống binaryTree giá trị các node bên trái phải nhỏ hơn node gốc, node bên phải lớn hơn node gốc
- có 4 cách duyệt:
1/ Inorder: duyệt từ trái sang
2/ Postoder: duyệt từ dưới lên
3/ Preorder: duyệt từ trên xuống
4/Breath-first duyệt cùng bậc