10 câu hỏi có thể gặp khi phỏng vấn
Chọn theo kỹ năng và cấp của tin (Java, JavaScript & TypeScript, ReactJS). Gợi ý trả lời do Drama Công Ty biên soạn để bạn ôn nhanh, không phải đề của công ty.
01Vì sao
Stringlà immutable? Khi nào dùngStringBuilderthay choString?Java · JuniorGợi ý trả lời
Ôn thêm câu hỏi Java →Stringbất biến: mọi thao tác "sửa" đều tạo object mới. Nhờ vậy nó an toàn khi chia sẻ giữa nhiều thread, dùng làm key choHashMapđược (hash không đổi) và JVM có thể dùng chung qua string pool.- Nối chuỗi trong vòng lặp bằng
+tạo nhiều object trung gian, nên dùngStringBuilder:
var sb = new StringBuilder(); for (String s : items) sb.append(s).append(','); String result = sb.toString();StringBuffergiốngStringBuildernhưng các method cósynchronized, chậm hơn và hiếm khi cần.- Nối vài chuỗi trên một dòng thì cứ dùng
+, compiler đã tối ưu sẵn.
Người phỏng vấn muốn nghe: bạn hiểu lý do thiết kế (an toàn, hash, pool), không chỉ thuộc định nghĩa.
- Nối chuỗi trong vòng lặp bằng
02Checked exception và unchecked exception khác nhau thế nào?
try-with-resourcesdùng để làm gì?Java · JuniorGợi ý trả lời
Ôn thêm câu hỏi Java →Checked exception (kế thừa
Exceptionnhưng không phảiRuntimeException) bị compiler bắt buộc phảicatchhoặc khai báothrows, ví dụIOException. Unchecked (RuntimeExceptionvà con của nó) thì không, ví dụNullPointerException,IllegalArgumentException.- Checked hợp với lỗi bên ngoài mà caller có thể xử lý được; unchecked thường là lỗi lập trình hoặc vi phạm điều kiện.
try-with-resourcestự gọiclose()cho mọi object implementAutoCloseable, kể cả khi có exception:
try (var reader = Files.newBufferedReader(path)) { return reader.readLine(); }Hay sai:
catch (Exception e) {}rồi bỏ trống, làm mất dấu lỗi. Ít nhất phải log kèm stack trace, hoặc bọc lại thành exception có ý nghĩa và ném tiếp.03
HashMaphoạt động bên trong như thế nào? So sánhArrayListvàLinkedList.Java · JuniorGợi ý trả lời
Ôn thêm câu hỏi Java →HashMaplà mảng các bucket. Khiput, nó tínhhashCode()của key, suy ra chỉ số bucket, rồi lưu entry vào đó. Nhiều key trùng bucket thì nối thành danh sách; từ Java 8, khi một bucket quá dài thì chuyển thành cây đỏ đen để tránh tìm kiếm O(n).- Khi số phần tử vượt
capacity * loadFactor(mặc định 0.75) thì map resize gấp đôi và phân bố lại. get/puttrung bình O(1).HashMapkhông thread-safe.
ArrayListdựa trên mảng: truy cập theo index O(1), thêm cuối nhanh, chèn/xoá ở giữa phải dời phần tử.LinkedListlà danh sách liên kết đôi: truy cập theo index O(n), tốn bộ nhớ hơn cho mỗi node.Người phỏng vấn muốn nghe: trên thực tế
ArrayListgần như luôn nhanh hơn nhờ dữ liệu nằm liền nhau trong bộ nhớ (cache-friendly).- Khi số phần tử vượt
04Closure là gì? Giải thích kết quả của vòng lặp
for (var i...)vớisetTimeout.JavaScript & TypeScript · JuniorGợi ý trả lời
Ôn thêm câu hỏi JavaScript & TypeScript →Closure là khi một hàm "nhớ" được các biến ở phạm vi nơi nó được tạo ra, kể cả sau khi hàm bên ngoài đã chạy xong.
for (var i = 0; i < 3; i++) { setTimeout(() => console.log(i), 0); } // In ra 3, 3, 3varchỉ có một biếnicho cả vòng lặp. Khi callback chạy, vòng lặp đã xong vàibằng 3.- Đổi sang
letthì mỗi vòng lặp có mộtiriêng, in ra 0, 1, 2.
Ứng dụng thực tế: tạo biến private, hàm factory, debounce, memoize, và các hook trong React.
Hay sai: closure giữ tham chiếu đến biến chứ không chụp lại giá trị. Closure giữ object lớn quá lâu (ví dụ trong listener không gỡ) cũng là nguồn rò rỉ bộ nhớ.
05
thistrong JavaScript được xác định thế nào? Arrow function khác function thường ở điểm nào?JavaScript & TypeScript · JuniorGợi ý trả lời
Ôn thêm câu hỏi JavaScript & TypeScript →Với function thường,
thisphụ thuộc vào cách gọi, không phải nơi định nghĩa:obj.method():thislàobj.- Gọi hàm trơn
fn():undefinedtrong strict mode (module và class luôn là strict). new Fn(): object mới được tạo.fn.call(x),fn.apply(x),fn.bind(x):thislàx.
Arrow function không có
thisriêng; nó lấythiscủa phạm vi bao ngoài. Arrow function cũng không cóargumentsvà không dùng được vớinew.const btn = { label: "OK", click() { setTimeout(() => console.log(this.label)); } };Hay sai: truyền
obj.methodlàm callback (setTimeout(obj.method)) rồi mấtthis. Cách sửa:bind, hoặc bọc trong arrow function.06Controlled component và uncontrolled component khác nhau thế nào? Khi nào dùng loại nào?ReactJS · Junior
Gợi ý trả lời
Ôn thêm câu hỏi ReactJS →Controlled: giá trị input nằm trong state React, mọi thay đổi đi qua
onChange. Uncontrolled: DOM tự giữ giá trị, bạn đọc khi cần quarefhoặc khi form submit.<input value={name} onChange={e => setName(e.target.value)} /> <input defaultValue="An" name="name" />- Controlled hợp khi cần validate ngay khi gõ, định dạng giá trị, hoặc ô này phụ thuộc ô kia.
- Uncontrolled đơn giản hơn, ít render hơn; hợp với form lớn hoặc khi dùng thư viện như React Hook Form. React 19 còn hỗ trợ truyền hàm vào
<form action>và đọc dữ liệu bằngFormData.
Hay sai: chuyển một input từ
value={undefined}sang có giá trị, khiến React cảnh báo đổi từ uncontrolled sang controlled. Khởi tạo state bằng""thay vìundefined.07Dependency Injection trong Spring là gì? Vì sao nên dùng constructor injection thay cho
@Autowiredtrên field?JavaGợi ý trả lời
Ôn thêm câu hỏi Java →IoC container của Spring tạo và quản lý các bean, rồi "tiêm" phụ thuộc vào class cần dùng, thay vì class tự
new. Nhờ vậy code ít phụ thuộc cứng, dễ thay implementation và dễ test.Constructor injection được khuyên dùng vì:
- Field có thể là
final, object luôn ở trạng thái đầy đủ sau khi tạo. - Test unit không cần Spring: chỉ cần
new OrderService(mockRepo). - Constructor quá nhiều tham số là dấu hiệu class đang ôm nhiều việc.
- Class chỉ có một constructor thì không cần ghi
@Autowired.
Nên nói thêm về scope: mặc định bean là
singleton(một instance cho cả context), ngoài ra cóprototype,request,session.Hay sai: để state thay đổi được (ví dụ biến đếm, list) trong bean singleton. Nhiều request chạy song song sẽ dùng chung và gây race condition.
- Field có thể là
08
@Transactionalhoạt động thế nào? Vì sao có lúc gắn annotation rồi mà transaction không chạy?JavaGợi ý trả lời
Ôn thêm câu hỏi Java →Spring tạo proxy bao quanh bean. Khi gọi method có
@Transactionalqua proxy, proxy mở transaction, gọi method thật, rồi commit hoặc rollback.Những lý do hay gặp khiến nó "không ăn":
- Self-invocation: method A trong cùng class gọi
this.b()có@Transactional, lời gọi không đi qua proxy. - Method là
privatehoặcfinal: proxy không chặn được lời gọi. - Mặc định chỉ rollback với unchecked exception và
Error. Checked exception vẫn commit, trừ khi khai báorollbackFor = Exception.class. - Exception bị
catchvà nuốt bên trong method.
Nên biết thêm
propagation(REQUIRED,REQUIRES_NEW) vàreadOnly = truecho các truy vấn chỉ đọc.Người phỏng vấn muốn nghe: bạn giải thích được bằng cơ chế proxy, không chỉ liệt kê lỗi.
- Self-invocation: method A trong cùng class gọi
09Lỗi N+1 query trong JPA/Hibernate là gì và xử lý ra sao?Java
Gợi ý trả lời
Ôn thêm câu hỏi Java →N+1 xảy ra khi bạn lấy N bản ghi bằng 1 query, rồi mỗi lần truy cập quan hệ lazy lại phát sinh thêm 1 query. Ví dụ lấy 100 đơn hàng, rồi gọi
order.getCustomer()trong vòng lặp là thành 101 query.Cách xử lý:
JOIN FETCHtrong JPQL:select o from Order o join fetch o.customer.@EntityGraph(attributePaths = "customer")trên method của repository.@BatchSizehoặchibernate.default_batch_fetch_sizeđể gom lazy load thành câuIN (...).- Với màn hình chỉ đọc, trả thẳng DTO projection thay vì entity.
Phát hiện bằng cách bật log SQL (
spring.jpa.show-sqlhoặc log của Hibernate) khi dev, hoặc dùng thống kê của Hibernate.Hay sai: đổi sang
FetchType.EAGERcho xong. Cách này chỉ đổi chỗ lỗi và làm mọi truy vấn khác nặng hơn. Fetch join nhiều collection cùng lúc cũng dễ gây tích Descartes.10Bạn thấy mình ở đâu sau 2–3 năm nữa?Câu hỏi hành vi & văn hoá
Gợi ý trả lời
Ôn thêm câu hỏi Câu hỏi hành vi & văn hoá →Người phỏng vấn muốn biết mục tiêu của bạn có khớp với hướng phát triển ở công ty và bạn có định gắn bó không.
- Nêu hướng phát triển cụ thể, thực tế: đi sâu chuyên môn (senior, chuyên gia một mảng) hay quản lý (lead, PM).
- Kèm kế hoạch: kỹ năng cần học, trách nhiệm muốn nhận thêm.
- Gắn với cơ hội ở vị trí đang ứng tuyển.
Câu mẫu: "Trong 2–3 năm tới em muốn trở thành senior có thể tự thiết kế và chịu trách nhiệm một module lớn, đồng thời hướng dẫn được các bạn mới. Em đang học thêm về thiết kế hệ thống và thấy team bên mình có nhiều bài toán ở quy mô lớn, rất hợp để em phát triển theo hướng đó."
Hay sai: "Em muốn mở công ty riêng" hoặc "em chưa nghĩ tới". Cũng đừng nói muốn ngồi vào chỗ của người đang phỏng vấn.
Bạn đã phỏng vấn ở LEAP?
Kể lại các vòng và câu hỏi đã gặp (ẩn danh) để người sau ôn đúng trọng tâm.
Chia sẻ kinh nghiệm phỏng vấn