Mở đăng ký khóa học Fullstack qua Zoom. Tham khảo tại đây

Thư Viện Câu Hỏi Phỏng Vấn

Tổng hợp các câu hỏi tuyển dụng thực tế theo nhiều cấp độ từ Entry đến Expert để bạn tự tin chinh phục nhà tuyển dụng.

Interactive Practice Tổng cộng 4,442 câu hỏi độc bản

Luyện Tập Phỏng Vấn Thử

Mô phỏng áp lực phỏng vấn thật với đồng hồ đếm ngược từng câu, tự đánh giá phản xạ và đo lường độ sẵn sàng của bạn.

Vui lòng đăng nhập để tham gia luyện tập và lưu tiến độ phỏng vấn.
Tất cả công nghệ .Net (39) ADO.NET (44) Agile scrum (33) Android (40) Angular (40) API Design (40) Arrays (40) ASP.NET (42) ASP.NET MVC (40) ASP.NET Web API (49) Availability & Reliability (40) Azure (49) Backtracking (40) Big-O Notation (35) Binary Tree (40) Bit Manipulation (40) Blockchain (45) C# (45) Caching (50) CAP Theorem (45) CDN (45) Concurrency (49) Cosmos DB (44) Cryptography (40) CSS (40) Data Structures (40) Databases (35) DDD (42) Dependency Injection (50) Design pattern (45) Devops (50) Divide & Conquer (40) Docker (43) Dynamic Programming (40) Entity Framework (40) Fibonacci Series (35) Flutter (40) Git (40) Go lang (40) Graph Theory (40) GraphQL (40) Greedy Algorithms (40) Hash Tables (40) Heaps and Maps (35) HTML (40) Ionic (45) IOS (45) Java (73) Javascript (81) jQuery (40) Kotlin (50) Kubernetes (11) Laravel (41) Layering & Middleware (44) Linked Lists (45) LINQ (40) Load Balancing (45) Microservices (44) Mongodb (45) MySQL (44) Net core (44) next.js (52) Node.js (40) NoSQL (48) Objective-C (40) OOP (44) Package Managerment (50) PHP (40) PostgreSQL (44) PWA (40) Python (41) Queues (44) React Native (48) React.js (45) Reactive Programming (50) Recursion (45) Redis (40) Ruby (44) Ruby on Rails (48) Rust (40) Searching (45) SOA (42) Software Architecture (44) Software Testing (40) Sorting (48) Spring (45) SQL (37) SQL Server (45) Stacks (44) Strings (50) Swift (45) System Design (56) Systems Design (7) T-SQL (39) Trees (49) Trie (35) Typescript (44) Unit testing (49) UX Design (50) Vue.js (50) Web security (40) WebSockets (49) Xamarin (40)
Khóa học Chuyên sâu Kotlin

Làm Chủ Phỏng Vấn & Nâng Cao Trình Độ Chuyên Nghiệp

Hệ thống khóa học thực chiến chuẩn Enterprise giúp bạn tự tin chinh phục mọi kỳ phỏng vấn kỹ thuật và thăng tiến thu nhập.

01

Trong Kotlin, cơ chế Null Safety được thực hiện như thế nào ở tầng biên dịch và tại sao nó giúp giảm thiểu lỗi NullPointerException so với Java?

Junior

Cơ chế Null Safety trong Kotlin

Kotlin phân biệt rõ ràng giữa các loại tham chiếu có thể chứa null (nullable) và không thể chứa null (non-nullable) ngay tại hệ thống kiểu (type system).

Nội dung chi tiết câu trả lời, phân tích kỹ thuật chuyên sâu, mã nguồn minh họa và các trường hợp ngoại lệ chỉ dành riêng cho học viên Unicode E-learning...

Để mở khóa toàn bộ giải pháp chi tiết và tài liệu hướng dẫn phỏng vấn, vui lòng nâng cấp tài khoản hoặc tham gia gói Learning Pass để truy cập không giới hạn.

// Mã nguồn và kiến trúc giải pháp bị ẩn đối với tài khoản chưa nâng cấp...
02

Tại sao việc sử dụng 'Sealed Classes' lại được khuyến khích hơn 'Enum Classes' khi xây dựng các trạng thái (State) trong kiến trúc MVVM?

Junior

So sánh Sealed Classes và Enum Classes

Trong kiến trúc MVVM, việc quản lý trạng thái UI (Loading, Success, Error) yêu cầu sự linh hoạt cao.

Nội dung chi tiết câu trả lời, phân tích kỹ thuật chuyên sâu, mã nguồn minh họa và các trường hợp ngoại lệ chỉ dành riêng cho học viên Unicode E-learning...

Để mở khóa toàn bộ giải pháp chi tiết và tài liệu hướng dẫn phỏng vấn, vui lòng nâng cấp tài khoản hoặc tham gia gói Learning Pass để truy cập không giới hạn.

// Mã nguồn và kiến trúc giải pháp bị ẩn đối với tài khoản chưa nâng cấp...
03

Trong Kotlin, sự khác biệt giữa 'open class' và 'final class' là gì, và tại sao mặc định các class trong Kotlin lại là 'final'?

Junior

Cơ chế kế thừa trong Kotlin

1. Định nghĩa

  • Final class (mặc định): Không thể kế thừa. Đây là thiết kế mặc định của Kotlin.
  • Open class: Cho phép các class khác kế thừa từ nó.

2. Tại sao mặc định là 'final'?

  • Hiệu năng: Trình biên dịch có thể tối ưu hóa các lời gọi hàm (static dispatch) vì biết chắc chắn không có sự thay đổi hành vi từ class con.
  • Bảo mật và ổn định: Tránh việc vô tình thay đổi hành vi của class thông qua kế thừa (Fragile Base Class problem). Điều này giúp code dễ dự đoán hơn trong các hệ thống lớn.

3. Ví dụ

class Base // Mặc định là final, không thể kế thừa
open class Parent // Phải có từ khóa open để kế thừa
class Child : Parent()

Lưu ý thực chiến: Chỉ nên dùng open khi bạn thực sự thiết kế class đó để phục vụ mục đích mở rộng (polymorphism).

04

Cơ chế 'Data Classes' trong Kotlin tự động sinh ra những phương thức nào và tại sao nó lại quan trọng đối với các lớp chứa dữ liệu (POJO/DTO)?

Junior

Data Classes trong Kotlin

Data classes được thiết kế chuyên biệt để lưu trữ dữ liệu, giúp giảm thiểu boilerplate code.

Nội dung chi tiết câu trả lời, phân tích kỹ thuật chuyên sâu, mã nguồn minh họa và các trường hợp ngoại lệ chỉ dành riêng cho học viên Unicode E-learning...

Để mở khóa toàn bộ giải pháp chi tiết và tài liệu hướng dẫn phỏng vấn, vui lòng nâng cấp tài khoản hoặc tham gia gói Learning Pass để truy cập không giới hạn.

// Mã nguồn và kiến trúc giải pháp bị ẩn đối với tài khoản chưa nâng cấp...
05

Trong Kotlin, tại sao việc sử dụng 'Sequence' lại hiệu quả hơn 'Iterable' khi xử lý các tập hợp dữ liệu lớn với nhiều thao tác trung gian?

Junior

Sequence vs Iterable

1. Cơ chế hoạt động

  • Iterable (Eager evaluation): Mỗi thao tác (map, filter) sẽ tạo ra một tập hợp mới ngay lập tức. Điều này gây tốn bộ nhớ khi xử lý danh sách lớn.
  • Sequence (Lazy evaluation): Các thao tác được thực hiện theo từng phần tử (pipeline). Phần tử đầu tiên đi qua toàn bộ chuỗi thao tác trước khi phần tử thứ hai bắt đầu.

2. Khi nào nên dùng Sequence?

  • Khi danh sách dữ liệu đầu vào rất lớn.
  • Khi có nhiều thao tác trung gian (chaining).
  • Khi bạn chỉ cần lấy một phần kết quả (ví dụ: find, first).

3. Ví dụ

val list = (1..1000000).toList()
val result = list.asSequence()
    .filter { it % 2 == 0 }
    .map { it * 2 }
    .toList()

Lưu ý thực chiến: Với danh sách nhỏ, Iterable thường nhanh hơn do overhead của việc tạo object Sequence. Chỉ ưu tiên Sequence khi tối ưu hóa hiệu năng cho tập dữ liệu lớn.

06

Trong Kotlin, tại sao việc sử dụng 'lateinit' lại được coi là một công cụ mạnh mẽ nhưng tiềm ẩn rủi ro, và làm thế nào để kiểm tra trạng thái khởi tạo của nó một cách an toàn?

Junior

Bản chất của lateinit

'lateinit' cho phép khai báo một thuộc tính không null mà không cần khởi tạo ngay tại thời điểm định nghĩa. Điều này cực kỳ hữu ích trong các framework như Android (ví dụ: khởi tạo View trong onCreate) hoặc Dependency Injection.

Nội dung chi tiết câu trả lời, phân tích kỹ thuật chuyên sâu, mã nguồn minh họa và các trường hợp ngoại lệ chỉ dành riêng cho học viên Unicode E-learning...

Để mở khóa toàn bộ giải pháp chi tiết và tài liệu hướng dẫn phỏng vấn, vui lòng nâng cấp tài khoản hoặc tham gia gói Learning Pass để truy cập không giới hạn.

// Mã nguồn và kiến trúc giải pháp bị ẩn đối với tài khoản chưa nâng cấp...
07

Sự khác biệt giữa 'val' và 'const val' trong Kotlin là gì, và tại sao việc chọn sai có thể ảnh hưởng đến hiệu năng trong các dự án Enterprise?

Junior

Khác biệt cốt lõi

  • 'val': Là biến chỉ đọc (read-only). Giá trị của nó được xác định tại thời điểm runtime.
  • 'const val': Là hằng số biên dịch (compile-time constant). Giá trị của nó phải được biết tại thời điểm biên dịch.

Ảnh hưởng hiệu năng

  • 'const val' được thay thế trực tiếp bằng giá trị thực tế tại nơi sử dụng (inlining), giúp giảm thiểu việc truy cập bộ nhớ hoặc gọi hàm getter.
  • 'val' thông thường sẽ tạo ra một phương thức getter ẩn, gây ra overhead nhỏ khi truy cập.

Quy tắc áp dụng

  • Sử dụng 'const val' cho các giá trị cố định như cấu hình, key, hoặc các giá trị không bao giờ thay đổi trong suốt vòng đời ứng dụng.
  • Sử dụng 'val' khi giá trị phụ thuộc vào logic tính toán hoặc kết quả từ hàm khác tại runtime.

Lưu ý

'const val' chỉ có thể được khai báo ở cấp độ file (top-level) hoặc bên trong 'object' / 'companion object'.

08

Cơ chế 'Delegated Properties' trong Kotlin là gì và tại sao việc sử dụng 'by lazy' lại giúp tối ưu hóa tài nguyên hệ thống?

Junior

Cơ chế Delegated Properties

Delegation cho phép chuyển giao logic của việc truy cập (getter/setter) của một thuộc tính cho một đối tượng khác. Điều này giúp tách biệt logic quản lý dữ liệu khỏi logic nghiệp vụ.

Nội dung chi tiết câu trả lời, phân tích kỹ thuật chuyên sâu, mã nguồn minh họa và các trường hợp ngoại lệ chỉ dành riêng cho học viên Unicode E-learning...

Để mở khóa toàn bộ giải pháp chi tiết và tài liệu hướng dẫn phỏng vấn, vui lòng nâng cấp tài khoản hoặc tham gia gói Learning Pass để truy cập không giới hạn.

// Mã nguồn và kiến trúc giải pháp bị ẩn đối với tài khoản chưa nâng cấp...
09

Trong Kotlin, sự khác biệt giữa 'map' và 'flatMap' khi xử lý các tập hợp dữ liệu (Collections) là gì, và khi nào nên ưu tiên sử dụng cái nào?

Junior

Bản chất

  • 'map': Biến đổi từng phần tử trong một tập hợp thành một giá trị khác. Kết quả là một tập hợp mới có cùng số lượng phần tử.
  • 'flatMap': Biến đổi từng phần tử thành một tập hợp con, sau đó gộp (flatten) tất cả các tập hợp con đó thành một tập hợp duy nhất.

Khi nào sử dụng?

  • Sử dụng 'map' khi bạn cần chuyển đổi kiểu dữ liệu 1-1 (ví dụ: chuyển danh sách User thành danh sách tên User).
  • Sử dụng 'flatMap' khi mỗi phần tử chứa một danh sách con và bạn muốn lấy ra tất cả các phần tử con đó thành một danh sách phẳng (ví dụ: lấy danh sách tất cả các đơn hàng từ danh sách khách hàng).

Tối ưu hóa

Trong các hệ thống Enterprise xử lý dữ liệu lớn, việc sử dụng 'flatMap' không hợp lý có thể gây tốn bộ nhớ do tạo ra nhiều tập hợp trung gian. Hãy cân nhắc sử dụng 'Sequence' để xử lý dữ liệu theo cơ chế lazy evaluation.

10

Tại sao việc sử dụng 'String' nối chuỗi bằng toán tử '+' trong vòng lặp lại không được khuyến khích trong Kotlin, và giải pháp thay thế tối ưu là gì?

Junior

Vấn đề hiệu năng

Trong Java/Kotlin, 'String' là bất biến (immutable). Mỗi khi bạn dùng toán tử '+', một đối tượng 'String' mới sẽ được tạo ra trong bộ nhớ. Nếu thực hiện trong vòng lặp lớn, nó sẽ tạo ra hàng nghìn đối tượng thừa, gây áp lực lên Garbage Collection (GC).

Nội dung chi tiết câu trả lời, phân tích kỹ thuật chuyên sâu, mã nguồn minh họa và các trường hợp ngoại lệ chỉ dành riêng cho học viên Unicode E-learning...

Để mở khóa toàn bộ giải pháp chi tiết và tài liệu hướng dẫn phỏng vấn, vui lòng nâng cấp tài khoản hoặc tham gia gói Learning Pass để truy cập không giới hạn.

// Mã nguồn và kiến trúc giải pháp bị ẩn đối với tài khoản chưa nâng cấp...
11

Trong Kotlin, cơ chế Smart Cast hoạt động như thế nào và tại sao đôi khi trình biên dịch lại không thể thực hiện Smart Cast đối với các biến thuộc tính của lớp (Properties)?

Junior

Bản chất cơ chế Smart Cast

Smart Cast trong Kotlin là tính năng tự động chuyển đổi kiểu dữ liệu của một biến sau khi nó đã được kiểm tra kiểu (type check) thông qua toán tử is. Trình biên dịch Kotlin sẽ theo dõi luồng điều khiển (control flow) và tự động ép kiểu mà lập trình viên không cần phải gọi tường minh các hàm ép kiểu như as.

Nội dung chi tiết câu trả lời, phân tích kỹ thuật chuyên sâu, mã nguồn minh họa và các trường hợp ngoại lệ chỉ dành riêng cho học viên Unicode E-learning...

Để mở khóa toàn bộ giải pháp chi tiết và tài liệu hướng dẫn phỏng vấn, vui lòng nâng cấp tài khoản hoặc tham gia gói Learning Pass để truy cập không giới hạn.

// Mã nguồn và kiến trúc giải pháp bị ẩn đối với tài khoản chưa nâng cấp...
12

Sự khác biệt cốt lõi giữa hàm thông thường và Tail-recursive Functions (tailrec) trong Kotlin là gì và khi nào nên áp dụng trong lập trình Enterprise?

Junior

Khái niệm và Vấn đề của đệ quy thông thường

Đệ quy thông thường (Standard Recursion) lưu trữ các Stack Frame trong Call Stack cho mỗi lời gọi hàm. Khi số lượng lời gọi quá lớn (ví dụ hàng nghìn lần), hệ thống sẽ gặp lỗi StackOverflowError.

Nội dung chi tiết câu trả lời, phân tích kỹ thuật chuyên sâu, mã nguồn minh họa và các trường hợp ngoại lệ chỉ dành riêng cho học viên Unicode E-learning...

Để mở khóa toàn bộ giải pháp chi tiết và tài liệu hướng dẫn phỏng vấn, vui lòng nâng cấp tài khoản hoặc tham gia gói Learning Pass để truy cập không giới hạn.

// Mã nguồn và kiến trúc giải pháp bị ẩn đối với tài khoản chưa nâng cấp...
13

Trong Kotlin, Destructuring Declarations hoạt động dựa trên cơ chế nào và những rủi ro nào cần tránh khi áp dụng vào các Data Models trong hệ thống lớn?

Junior

Cơ chế hoạt động

Destructuring Declarations cho phép giải cấu trúc một đối tượng thành nhiều biến riêng lẻ chỉ trong một dòng lệnh. Cơ chế này hoạt động dựa trên các hàm toán tử được định nghĩa sẵn trong lớp gọi là componentN() (ví dụ: component1(), component2(),...). Đối với các data class, trình biên dịch Kotlin tự động sinh ra các hàm componentN() tương ứng với thứ tự khai báo của các thuộc tính trong constructor chính.

Nội dung chi tiết câu trả lời, phân tích kỹ thuật chuyên sâu, mã nguồn minh họa và các trường hợp ngoại lệ chỉ dành riêng cho học viên Unicode E-learning...

Để mở khóa toàn bộ giải pháp chi tiết và tài liệu hướng dẫn phỏng vấn, vui lòng nâng cấp tài khoản hoặc tham gia gói Learning Pass để truy cập không giới hạn.

// Mã nguồn và kiến trúc giải pháp bị ẩn đối với tài khoản chưa nâng cấp...
14

Nested Classes và Inner Classes trong Kotlin khác nhau như thế nào về mặt tham chiếu bộ nhớ, và việc sử dụng sai có thể dẫn đến hậu quả gì trong ứng dụng Android hoặc Backend?

Junior

Phân biệt Nested Classes và Inner Classes

Nội dung chi tiết câu trả lời, phân tích kỹ thuật chuyên sâu, mã nguồn minh họa và các trường hợp ngoại lệ chỉ dành riêng cho học viên Unicode E-learning...

Để mở khóa toàn bộ giải pháp chi tiết và tài liệu hướng dẫn phỏng vấn, vui lòng nâng cấp tài khoản hoặc tham gia gói Learning Pass để truy cập không giới hạn.

// Mã nguồn và kiến trúc giải pháp bị ẩn đối với tài khoản chưa nâng cấp...
15

Tính năng Type Aliases trong Kotlin giải quyết bài toán gì và cách áp dụng chúng để cải thiện tính dễ đọc của mã nguồn trong các kiến trúc phức tạp?

Junior

Khái niệm Type Aliases

Type Aliases cho phép định nghĩa một tên gọi thay thế (alias) cho các kiểu dữ liệu đã tồn tại. Nó không tạo ra một kiểu dữ liệu mới hoàn toàn mà chỉ cung cấp một định danh ngắn gọn và dễ hiểu hơn cho kiểu dữ liệu gốc.

Nội dung chi tiết câu trả lời, phân tích kỹ thuật chuyên sâu, mã nguồn minh họa và các trường hợp ngoại lệ chỉ dành riêng cho học viên Unicode E-learning...

Để mở khóa toàn bộ giải pháp chi tiết và tài liệu hướng dẫn phỏng vấn, vui lòng nâng cấp tài khoản hoặc tham gia gói Learning Pass để truy cập không giới hạn.

// Mã nguồn và kiến trúc giải pháp bị ẩn đối với tài khoản chưa nâng cấp...
High-Ticket Mentoring
Cần Mentor Phỏng Vấn Thử 1-1 & Tối Ưu CV?

Mô phỏng phỏng vấn kỹ thuật thực tế 1-1 qua Google Meet, nhận xét chi tiết điểm mạnh/yếu và sửa CV trực tiếp cùng giảng viên Unicode.

AI Resume Scanner
Kiểm Tra CV Chuẩn ATS Miễn Phí

Tải CV của bạn lên để hệ thống AI rà soát từ khóa kỹ năng, định dạng và tính điểm chuẩn nhà tuyển dụng.

vừa nâng cấp PRO khóa 1 phút trước   Tìm hiểu khóa học