Professional Documents
Culture Documents
Câu hỏi PV Java
Câu hỏi PV Java
JAVA CORE
Spring
Database
Other
Câu hỏi
Cách tạo một đối tượng được tuần tự hóa trong java
Biến static là gì
Khối static là gì
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 đa hình
Tính đóng gói
CopyOnWriteArrayList là gì
ConcurrentHashMap vs SynchronizedMap
Queue vs Stack
Cách tạo luồng trong Java
Hiểu về join
Biến volatile
Notify và wait()
CountDownLatch là gì
Runnable vs Callable
thread pool là gì
CompletableFuture vs Future
Dependency injection là gì
ORM là gì
transaction vs session
Persistence context là gì
hibernate cache
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ì
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
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 ).
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à 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
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
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
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
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()
Đầ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
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
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ượ
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 độ
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) .
*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,
*Lazy Loading
* 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
(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
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