Download as xlsx, pdf, or txt
Download as xlsx, pdf, or txt
You are on page 1of 41

Công nghệ

JAVA CORE
Spring
Database

Other
Câu hỏi

Lớp singleton là gì? Cho một ví dụ thực tế về cách sử


dụng của nó

Sự khác biệt giữa Abstract Class và Interface

Cách tạo một đối tượng được tuần tự hóa trong java

Khi nào chúng ta nên sử dụng tuần tự hóa

Biến static là gì

Phương thức static là gì

Khối static là gì

Chúng ta có thể ghi đè các phương thức tĩnh – static


method của một lớp không

Biến final là gì
Phương thức final là gì
Lớp final là gì

Tại sao các String trong Java được gọi là Bất biến
Trong java có mấy loại exception

Kế thừa là gì

Tính trừu tượng

Tính đa hình
Tính đóng gói

Sự khác nhau giữa ArrayList và Vector là gì?


Sự khác nhau giữa ArrayList và LinkedList là gì

Sự khác nhau giữa Iterator và ListIterator là gì


Sự khác nhau giữa List và Set là gì?

Sự khác nhau giữa HashSet và TreeSet là gì

Sự khác nhau giữa HashMap và TreeMap là gì?

Làm thế nào để đồng bộ List, Set và Map (Đồng bộ các


phương thức của các collection này)

CopyOnWriteArrayList là gì

Fail-fast vs Fail-safe iterator

Hasmap hoạt động như nào


ConcurrentHashMap

ConcurrentHashMap vs SynchronizedMap

Queue vs Stack
Cách tạo luồng trong Java

Hiểu về join
Biến volatile

Nếu không sử dụng volatile thì thread khác có thể nhìn


thấy sự thay đổi biến từ thread khác không
synchronized Keyword

Notify và wait()

CountDownLatch là gì

Runnable vs Callable
thread pool là gì

CompletableFuture vs Future

Join và get trong CompletableFuture


Spring Boot
Có bao nhiêu bean scope trong Spring

Singleton scope thì bean sẽ được khởi tạo lúc nào

@Bean và @Component được sử dụng trong những


trường hợp cụ thể nào

Phân biệt giữa @Service, @Component và @Repository

Nếu có nhiều bean có cùng type (cùng implement


interface) thì làm thế nào để sử dụng một bean cụ thể

Tại sao khi chúng ta extend JpaRepositoty chúng ta lại


không cần thêm @Repository
Mối quan hệ giữa Spring Data JPA, JPA và
Hibernate/EclipseLink
@Transactional các propagation

Default rollbackFor của @Transactional

Dependency injection là gì

ORM là gì

Session factory và session ?

transaction vs session
Persistence context là gì

Tại sao nên dùng Hibernate thay vì JDBC

LAZY LOADING trong JPA là gì


Phân biệt get và load trong hibernate

Các trạng thái của một đối tượng trong Hibernate là gì

phương thức persist, merge ... trong hibernate


CasecadeType trong hibernate
orPhanRemoval

flush và clear, evict, refresh trong hibernate

hibernate cache

FetchMode và Fetch type trong hibernate

Xử lí n+1 câu query

Index là gì .....
Giải thích cách hoạt động của index
Nêu các loại index
Các để tối ưu câu query

clustered index là gì

Thứ tự thực thi các câu query

Sự khách nhau giữa Having và Where


Nêu các join
Docker
Kiến trúc Microservice
Cloud
Security
Lock permisstic
Trả lời

Một lớp singleton trong java chỉ có thể có một instance và do đó tất cả các phương thức
lớp. Ví dụ tốt nhất về kịch bản sử dụng singleton là khi có giới hạn chỉ có một kết nối vớ
vis dụ logger . Cách tạo : private constructor để hạn chế truy cập từ class bên ngoài. Đặ
tạo ở trên

PHÂ N BIỆ T KHI NÀ O DÙ NGhttps://docs.oracle.com/javase/tutorial/java/IandI/abstract.ht

Implement interface với tên Serializable

Tuần tự hoá được sử dụng khi dữ liệu cần được truyền qua mạng. Sử dụng tuần tự hóa
đến nơi.

Biến static có thể được sử dụng để tham chiếu thuộc tính chung của tất cả đối tượng (m
Biến static lấy bộ nhớ chỉ một lần trong Class Area tại thời gian tải lớp đó.

Một phương thức static thuộc lớp chứ không phải đối tượng của lớp.
Một phương thức static gọi mà không cần tạo một instance của một lớp.
Phương thức static có thể truy cập biến static và có thể thay đổi giá trị của nó.
Được sử dụng để khởi tạo thành viên dữ liệu static.
Nó được thực thi trước phương thức main tại lúc tải lớp

Không thể vì static method thuộc về lớp chứ không phải riêng instance nào

Nếu bạn tạo một biến với từ khóa final, bạn sẽ không thể thay đổi được giá trị của biến
Phương thức final không thể được ghi đè
Lớp final không thể được kế thừa.

vì giá trị đã được gán cho một chuỗi, nó không thể thay đổi và nếu thay đổi, một đối tượ
Checked exception là các ngoại lệ phải kiểm tra ngay ở compile-time VD Ví dụ như IOE
Unchecked exception là các ngoại lệ kiểm tra ở run-time .Unchecked Exception là các lớ
Error: Nó không giống các exception, nhưng vấn đề xảy ra vượt quá tầm kiểm soát của
dụ như OutOfMemoryError, VirtualMachineError, AssertionError, … Nó được bỏ qua tro

Kế thừa trong java là sự liên quan giữa hai class với nhau, trong đó có class cha (super
chỉ được truy cập các thành viên public và protected của class cha. Nó không được phé

Tư tưởng của kế thừa trong java là có thể tạo ra một class mới được xây dựng trên các
thể khai báo thêm các phương thức và thuộc tính khác.

Tính trừu tượng trong Java là tính chất không thể hiện cụ thể mà chỉ nêu tên vấn đề.. V
nào thì ta chưa đề cập đến.

Tính đa hình ( Polymorphism ) là một khái niệm mà chúng ta có thể thực hiện một công
( compile ).

Đa hình lúc thực thị được thể hiện bằng overide

Đa hình lúc biên dich được thể hiện bằng overload


Đóng gói là sự che giấu bên trong dữ liệu riêng của mỗi đối tượng của lớp được khai bá

Nó nhằm bảo vệ đối tượng không bị truy cập từ code bên ngoài vào để thay để giá trị c
của đối tượng đó. Tính chất này đảm bảo sự bảo mật, toàn vẹn của đối tượng trong Jav

Ví dụ trong một class có thuộc tính A có ràng buộc giá ttị khác không . vì vậy ta sẽ viết

ArrayList là KHÔNG synchronized <> Vector là synchronized.


ArrayList không phải là legacy class <> Vector là legacy class.
ArrayList tăng kích thước của nó bằng 50% kích thước mảng <> Vector tăng kích th
ArrayList sử dụng mảng động để lưu trữ các phần tử <> LinkedList sử dụng danh sách

ArrayList là một cấu trúc dữ liệu dựa trên chỉ mục (index), trong đó mỗi phần tử (eleme
phần tử trước nó, giá trị của phần tử và một tham chiếu tới phần tử kế tiếp.

Thao tác thêm và xóa phần tử với ArrayList là chậm bởi vì nó sử dụng nội bộ mảng. Bở
nó không cần sắp xếp lại các phần tử sau khi thêm hoặc xóa. Nó chỉ cần cập nhật lại th

Truy xuất phần tử trong ArrayList nhanh hơn LinkedList. Bởi vì các phần tử trong ArrayL
phải duyệt qua lần lượt các phần tử từ đầu tiên cho đến cuối cùng.

ArrayList có thể truy xuất ngẫu nhiên phần tử. <> LinkedList không thể truy xuất ngẫu n

ArrayList yêu cầu ít bộ nhớ hơn so với LinkedList. Bởi vì ArrayList chỉ lưu trữ dữ liệu (da
tham chiếu tới phần tử trước và sau nó.

KL :
ArrayList tốt hơn trong việc lưu trữ và truy xuất dữ liệu (get).

LinkedList tốt hơn trong việc thao tác dữ liệu (thêm/ xóa).

Iterator chỉ có thể duyệt theo hướng chuyển tiếp (chỉ có phương thức next) , ListIterator

Iterator có thể được sử dụng trong List, Set và Queue.

ListIterator chỉ có thể được sử dụng trong List.


List có thể chứa các phần tử trùng lặp (dublicate), trong khi Set chỉ chứa các phần tử du

HashSet không duy trì thứ tự nào, trong khi TreeSet duy trì thứ tự tăng dần.

HashMap duy trì không có thứ tự, trong khi TreeMap duy trì thứ tự tăng dần.

Lớp Collection cung cấp phương thức để làm cho các phần tử List, Set và Map là đồng

public static List synchronizedList(List l){}


public static Set synchronizedSet(Set s){}
public static SortedSet synchronizedSortedSet(SortedSet s){}
public static Map synchronizedMap(Map m){}
public static SortedMap synchronizedSortedMap(SortedMap m){}

CopyOnWriteArrayList là một biến thể an toàn theo luồng (thread-safe) của ArrayList. C
gây đột biến như add, set, remove, clear,... đều tạo ra một bản sao mới của mảng mà n

1. Fail-fast Iterator: fail ngay lập tức khi cấu trúc Collection bị thay đổi sau khi lấy iterato
Fail-fast sẽ throws a ConcurrentModificationException với 1 trong 2 điều kiện sau:
– Sau khi tạo Iterator, trong quá trình duyệt, có một thay đổi bất kỳ nào bởi bất kỳ metho
– Trong xử lý đa luồng(multithreaded processing): 1 thread cố gắng modify trong khi 1 t

2. Fail-safe Iterator: Không ném ra exception nếu modify structure khi đang duyệt iterati
Iterator của CopyOnWriteArrayList, ConcurrentHashMap keySet là fail-safe iterator.

hashCode(): HashMap cung cấp hoạt động put(key, value) để lưu trữ và get(key) để lấy
đó dùng hash để tìm đến bucket[1] tương ứng và lưu trữ Entry object trong đó. Khi get()
của key đó.
Bạn nên sử dụng ConcurrentHashMap khi bạn cần tính đồng bộ trong dự án của bạn.
Thread safe mà không cần đồng bộ hóa toàn bộ map.
Đọc có thể xảy ra rất nhanh trong khi ghi được thực hiện với một khóa.
Không có khóa ở cấp độ object.
ConcurrentHashMap không ném ra một ConcurrentModificationException nếu một luồng
ConcurrentHashMap sử dụng vô số khóa.
SynchronizedMap là object level lock . lock toàn bộ collection

ConcurrentHashMap là hashmap bucket level

Stack là cấu trúc dữ liệu hoạt động theo nguyên tắc: vào sau ra trước (Last in first out -

Queue, được hiểu là hàng đợi và là cấu trúc dữ liệu hoạt động theo nguyên tắc: vào trư

Ứng dụng Stack VD : Nút Undo trên text editor, như Notepad, MS Word

Ứng dụng của Queue : Hàng đợi ứng dụng gửi tin nhắn cái nào đến trước thì gửi trước
- Tạo luồng bằng cách extend từ lớp Thread
- Tạo luồng bằng cách implement từ Interface Runnable hoặc Callable

Có thể stop luồng bằng systax thread.interrupt() (thread là tên instance)

Xử lí exception : sử dụng uncaughtException

Thread.UncaughtExceptionHandler h = new Thread.UncaughtExceptionHandler() {


@Override
public void uncaughtException(Thread th, Throwable ex) {
System.out.println("Uncaught exception: " + ex);
}
};
Thread t = new Thread() {
@Override
public void run() {
System.out.println("Sleeping ...");
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
System.out.println("Interrupted.");
}
System.out.println("Throwing exception ...");
throw new RuntimeException();
}
};
t.setUncaughtExceptionHandler(h);
t.start();

thread join sẽ cho phép thread đó thực thi xong chương trình của nó, sau đó mới cho ph
thúc thì mới start chúng ta cần làm như sau :
T1.start()
T1.join()
T2.start()
T3.start()

Lưu ý T1.join() phải đăt trước T2.start(), T3.start()


Từ khóa volatile trong java được sử dụng để đánh dấu một biến sẽ được lưu trữ trong m
trị cho các biến volatile cũng tương tự sẽ ghi xuống main memory.

Đầu tiên ta nói tới việc khi không sử dụng biến volatile :
Trong ứng dụng đa luồng(multithread) khi mỗi luồng(thread) làm việc với các biến non-v
performance . khi biến đó thay đổi nó sẽ được ghi vào CPU cache chứ không phải mai

Khi nào sử dụng biến volatile

chúng ta chỉ sử dụng volatile khi chỉ có 1 thread ghi vào biến volatile và các thread khác

Có . Tuy nhiên không đảm bảo rằng có thể nhìn thấy ngay lập tức điều này phụ thuộc v
Với việc synchronized thì thread khi vào synchronized method hoặc block nó sẽ làm mớ
thay đổi của các variable đến main memory

synchronized keyword có thể được sử dụng để thể hiện cho 4 kiểu blocks khác nhau:

Instance methods
Static methods
Code blocks

Đối với Instance methods (không phải static) thì nó chỉ đồng bộ cùng instance . nghĩa là

Static methods thì đồng bộ cả class bởi nó gọi method trực tiếp chứ ko cần tạo instance

Code blocks thì đồng bộ một phần code của method

Hoặc đồng pass param là một biến hoặc một classs để đồng bộ biến và class đó khi x

wait sử dụng để tạm dừng một thread cho đến khi Notify được gọi trong trường hợp có

Wait và Notify chỉ hoạt động khi mà 2 phương thức này được gọi trong logic phải cùng

VD có 2 Thread T1 và T2 trong logic thread T1 gọi A.method1 có wait logic thì thread T
logic gọi notify là class1.notify()
notifyAll dùng để đánh thức tất cả thread đang wating

sử dụng để đảm bảo các thread khác phải chờ thread nào đó hoàn thành

Runnable ko có giá trị trả về còn Callable thì có . khi implment 2 interface này ta lần lượ

Runnable : void run();

Callable : V call() throws Exception;


Thread pool chưa các thread được kéo ra và được service provider phân công một côn
Hiệu năng tốt hơn: Tiết kiệm thời gian vì không cần phải tạo thread mới.

Stop CompletableFuture completableFuture.cancel(true); completableFuture là instance

CompletableFuture vs Future cung cấp các API rất tốt cho việc lập trình bất đồng bộ

Ngoài ra CompletableFuture khắc phục các hạn chế mà Future chưa thể làm được như

CompletableFuture thông báo và cho phép lắng nghe sự kiện hoàn thành, ta có thể xử l
thenApply... một điểm mạnh so với Future vì Future.get() bị chặn luồng
CompletableFuture hỗ trợ xử lý async và cả sync cho các hành động xử lý dữ liệu với c
Ta có thể bắt CompletableFuture hoàn thành và trả về một giá trị mặc định nào đó
CompletableFuture cho phép xử lý exception với method handle, handleAsync
CompletableFuture cho phép xử lý kết hợp nhiều tính toán bất đồng bộ với nhau như
Thực hiện các tính toán theo một thứ tự với method thenApply, thenRun, thenAccept(Ví
bắt sự kiện khi nhiều CompletableFuture hoàn thành với method allOf (ví dụ cả hành độ

Xử lí exception với exceptionally, handle method

join và get cả hai đều block thread tuy nhiên thì join throw unchecked exception còn get
Spring boot là một modul của spring nó cung cấp cho chúng ta các công cụ và cấu hình

Spring Boot mặc định nhúng sẵn Apache Tomcat vào để project của chúng ta có thể ch
quản lý version giúp chúng ta có thể bắt đầu sử dụng các lib một cách nhanh chóng chỉ

Nhược điểm : Thiếu kiểm soát. Do style cố định, Spring Boot tạo ra nhiều phụ thuộc khô
l;

Nếu sử dụng @Lazy thì nó sẽ khởi tạo tại lần đầu tiên được yêu cầu đến IoC container.

@Bean mình thường dùng để định nghĩa bean đối với các class từ thư viện bên thứ 3

@Component thì thường dùng đối với các class do mình tự định nghĩa

@Service và @Repositoty bản thân bên trong nó đã được chú thích với @Component n

Tuy nhiên @Service còn được dùng với mục đích phân loại bean thuộc dạng Service tr

@Repository tự động chuyển đổi giữa các exception gốc của database sang các DataA

@Quatifier để chỉ định tên của bean cụ thể cần dùng. Ngoài ra có thể sử dụng @Primar
được sử dụng.

Vì Spring boot detect các bean dựa trên việc chúng extend Repository interface
JPA là một đặc tả định nghĩa các API cho các object-relational mapping và quản lý các

Hibernate và EclipseLink là 2 JPA implementation được sử dụng phổ biến trong các ứn

Spring Data JPA là được tầng được xây dự phía trên tầng JPA. Có nghĩa là nó sẽ sử dụ
no-code repository, khởi tạo query thông qua tên hàm
Bố i cả nh có method A vớ i B A gọ i B : và A đượ c set REQUIRED và B đượ c set vớ i cá c tình hu

Nếu ta không định nghĩa rollbackFor thì default rollback for RuntimeException/unchecke

Inversion of Control (IoC) là một nguyên lý thiết kế trong công nghệ phần mềm trong đó
Với mô hình IoC thì class A không tự khởi tạo cũng không chịu trách nhiệm quản lý Cla
tạo lớp A, bằng gán thuộc tính ...)

Dependency Injection là một design pattern được phát triển nhằm để giảm thiểu tối đa s
vào lúc tượng lúc runtime

ORM (Object Relational Mapping), là một kỹ thuật/cơ chế lập trình thực hiện ánh xạ CS
buộc giữa các table tương ứng quan hệ giữa các class ‘has a’ , ‘is a’).

Session Factory Là một interface giúp tạo ra session kết nối đến database bằng cách đọ

Một session được sử dụng để có được một kết nối vật lý với một cơ sở dữ liệu. trong JP

Giả sử chúng ta cần giao dịch nên tới ngân hàng thì lúc này chúng ta đã có một phiên g
session vẫn chưa đóng chúng ta tiếp tục thực hiện giao dịch rút tiền Y (transaction) .

Như vậy một session có thể có nhiều transaction


Persistence context có thể coi là một “môi trường” chứa toàn bộ các đối tượng mà ta tạ

*Object Mapping
* HQL Hibernate cung cấp các câu lệnh truy vấn tương tự SQL, HQL của Hibernate hỗ
(association).
* Database Independent Code sử dụng Hibernate là độc lập với hệ quản trị cơ sở dữ liệ
khác
* Minimize Code Changes
khi ta thay đổi (thêm) cột vào bảng,

**Với JDBC ta phải thay đổi những gì:

Thêm thuộc tính vào POJO class.


Thay đổi method chứa câu truy vấn "select", "insert", "update" để bổ sung cột mới. Có th
**Với Hibernate ta chỉ cần:
Thêm thuộc tính vào POJO class.
Cập nhật Hibernate XML mapping file để thêm map column - property. Ta chỉ thay đổi d

*Lazy Loading

*Try-Catch Blocks các exception được chuyển đổi về unchecked exception

* Quản lý commit/rollback Transaction vơi JDBC thì chúng ta phải tự viết code rollback k

* Hibernate Caching

NÓ là một thiết kế để trì hoãn việc tải đối tượng từ database cho đến khi chúng ta sử d
Get lấy ra đối tượng trong database còn load thì trả về một proxy object

*Proxy Object là 1 đối tượng giả, nó chỉ có id, các thuộc tính khác không được khởi tạo,
vào DB để lấy dữ liệu

Có 4 trang thái : Transient, Persistent, Detached, Remove

(1) Transient: Trường hợp bạn tạo mới một đối tượng java từ một Entity, đối tượng đó c
(2) Persistent: Trường hợp bạn lấy ra đối tượng Entity bằng method get, load hoặc find,
Hibernate. Khi đối tượng ở trạng thái persistent, tất cả các thay đổi mà bạn thực hiện đố
(3) Transient -> Persistent: Session gọi một trong các method save, saveOrUpdate, per
huống nó sẽ insert hoặc update dữ liệu vào DB.
(4) Persistent -> Detached: Session gọi evict(..) hoặc clear() để đuổi các đối tượng có tr
Nếu nó không được đính (Attached) trở lại, nó sẽ bị bộ gom rác của Java quét đi theo c
(5) Detached -> Persistent: Sử dụng update(..), saveOrUpdate(..), merge(..) sẽ đính trở
thái Persistent (bền vững).
(6) Persistent -> Removed: Session gọi method remove(..), delete(..) để xóa một bản gh

https://gpcoder.com/6548-hibernate-lifecycle/
https://shareprogramming.net/cascade-in-hibernate/#CascadePERSIST
Sử dụng trong các anotation @OneToMany, @OneToOne Nó đánh dấu rằng các phần

Flush là quá trình đông bộ hóa state của persistence context với database . việc flush c
thực hiện method clear để kiểm chứng việc này vì hibernate sử dụng first-level cache là

Clear là thực hiện xóa tất cả đối tượng trong Persistent context
evict giống clear nhưng có đối số truyền vào xóa từng thằng một

Refresh là hành động query xuống DB để update entity (enitity phải ở trạng thái persiste

First Level Cache là persistence context (tham khảo câu trả lời ngay bên trên)

Second Level Cache Khác với L1, phạm vi lưu trữ đối tượng được mở rộng hơn trong L

Query cache

https://shareprogramming.net/phan-biet-fetchmode-va-fetchtype-trong-jpa-hibernate/#F

Sử dụng join fetch hoặc dùng fecth mode sub select (không ngon bằng join fetch )

Fetch mode join chỉ hoạt động những query theo ID duy nhất không hoạt động nếu chú

Bản chất của việc đánh index là việc chuyển đổi một hoặc nhiều column sang table mớ

Table index được sắp xếp theo thứ tự. Giá trị của column là giá trị của một/nhiều colum
Tìm kiếm nhanh hơn với một vài điều kiện trên column được đánh index.
Mỗi index được ánh xạ sang một hoặc nhiều row trong table chính.
Có thể index được nhiều cột cùng lúc, gọi là composite index.
Thứ nhất, DB Engine sẽ kiểm tra column với WHERE condition có được đánh index khô
read từ disk.

Thứ hai, table index được sắp xếp nên việc scan đơn giản hơn. Thay vì scan toàn bộ, s
Tree, không phải Binary Tree.

Balanced tree là một Binary Tree mà thỏa mãn tất cả các node có chiều cao của node c

Chiều cao của một node là quãng đường dài nhất đến node cuối cùng của nó .
https://www.baeldung.com/cs/height-balanced-tree
https://viblo.asia/p/003-hieu-ve-index-de-tang-performance-voi-postgresql-p2-m68Z049
Sử dụ ng index và Partitioning dataĐọ c về Partitioning data ở đâ y :https://viblo.asia/p/006

Thông thường chúng ta đánh index cho cloumn thì nó sẽ tạo table index và chỉ lưu thôn
index nó sẽ lưu full thông tin row luôn ko mất công ánh xa sang bảng chính để fetch da

Đầu tiên, như đã đề cập ở trên, InnoDB sẽ mặc định chọn Primary Key làm "index colum
Nếu table không có khai báo Primary key, InnoDB sẽ tìm kiếm cột nào thỏa mãn điều ki
Nếu trong table đó vẫn không có cột nào Unique và Not null, InnoDB sẽ dùng cách cuối

FROM and JOIN s · 2. WHERE · 3. GROUP BY · 4. HAVING · 5. SELECT · 6. DISTINC

Sự khác nhau của câu lênh này đến từ thứ thực thực thì
Where thực thi trước Group by còn Having thì thực thi sau Group by vì vậy Having có th
inner join , left join, right join , full join , cross join
Default lock timeout mysql : 50s, postgress : 0shttps://blog.mimacom.com/handling-pessim

You might also like