Là một lập trình viên Java, chắc hẳn bạn đã học rất nhiều kiến thức vô cùng quan trọng để có thể thực hiện các dự án của mình và chuẩn bị cho công việc sau này. Tuy nhiên, liệu những câu hỏi phỏng vấn tại các công ty có giống với những gì bạn đã học.
Hãy cùng đọc bài viết sau của Frog và tìm hiểu các câu hỏi phỏng vấn Java thường gặp để chuẩn bị tốt nhất cho buổi phỏng vấn trong tương lai nhé!
JDK là viết tắt của Java Development Kit – Bộ công cụ phát triển Java. JDK là một bộ công cụ phát triển phần mềm được dùng để phát triển ứng dụng trong Java.
JRE là viết tắt của Java Runtime Environment – Môi trường thực thi Java.
JRE bao gồm JVM, thư viện và các thành phần bổ sung để chạy các ứng dụng viết bằng ngôn ngữ Java.
JVM là viết tắt của Java Virtual Machine – Máy ảo Java.
JVM là máy ảo được sử dụng để chạy các chương trình Java.
Cách hoạt động của JVM: Khi chương trình Java được chạy, trình biên dịch sẽ dịch Java code thành bytecode và sau đó JVM sẽ thực hiện nhiệm vụ của mình: thông dịch bytecode thành mã máy cho máy tính thực hiện lệnh.

Lambda Expression là feature nổi bật nhất của Java 8, giúp cho cú pháp của Java trở nên đơn giản, rút gọn đi rất nhiều
package vn.viettuts.java8;
interface Drawable {
public void draw();
}
public class LambdaExpressionExample1 {
public static void main(String[] args) {
int width = 10;
// không sử dụng biểu thức lambda,
// phải sử dụng lớp nặc danh để cài đặt phương thức draw() cho Drawable
Drawable d = new Drawable() {
public void draw() {
System.out.println("Drawing " + width);
}
};
d.draw();
}
}
// Kết quả: Drawing 10
package vn.viettuts.java8;
//tùy chọn, nó đánh dấu lớp Drawable chỉ được có 1 method trừu tượng
@FunctionalInterface
interface Drawable {
public void draw();
}
public class LambdaExpressionExample2 {
public static void main(String[] args) {
int width = 10;
// sử dụng biểu thức lambda
Drawable d2 = () -> {
System.out.println("Drawing " + width);
};
d2.draw();
}
}
// Kết quả: Drawing 10
Java 8 cho phép thêm các method không trừu tượng bằng cách thêm từ khóa default:
Ví dụ:
public interface Calculate {
default int sum(int a, int b) {
return a + b;
}
}
class Calculator implements Calculate {
public static void main(String[] args) {
Calculator calculator = new Calculator();
calculator.sum(1, 2); // return 3
}
}
Tính năng Optional Class giúp giải quyết các vấn đề chủ yếu về nullpointer
NULL (trường hợp đối tượng mà nó reference tới bị null).NullPointerException.| No. | Phương thức & mô tả |
|---|---|
| 1 | static <T> Optional<T> empty() Trả về một Optional instance rỗng. |
| 2 | Optional<T> filter(Predicate<? super <T> predicate) Nếu như có giá trị hiện diện trong đối tượng Optional này và giá trị của nó khớp với Predicate truyền vào, nó sẽ trả về một Optional chứa giá trị đó, mặc khác sẽ trả về một Optional rỗng. |
| 3 | T get() Nếu như có giá trị trong Optional này, nó sẽ trả về giá trị đó, ngược lại sẽ ném ra NoSuchElementException nếu như đối tượng rỗng. |
| 4 | void ifPresent(Consumer<? super T> consumer) Nếu như đối tượng Optional đang chứa giá trị, nó sẽ áp dụng consumer được truyền vào cho giá trị của nó. Ngược lại thì không làm gì cả. |
| 5 | boolean isPresent() Phương thức này được sử dụng để kiểm tra xem trong đối tượng Optional có đang chứa giá trị hay không. Giá trị trả về là True nếu có giá trị và ngược lại trả về false. |
| 8 | static <T> Optional<T> of(T value) Trả về đối tượng Optional kiểu T chứa giá trị của value. |
| 7 | static <T> Optional<T> ofNullable(T value) Trả về một Optional chứa giá trị được truyền vào nếu khác null, ngược lại sẽ trả về một Optional rỗng. |
| 8 | T orElse(T other) Trả về giá trị của đối tượng Optional nếu có, ngược lại nó sẽ trả về đối tượng other mà bạn đã truyền vào phương thức này. |
| 9 | T orElseGet(Supplier<? extends T> other) Trả về giá trị nếu tồn tại, ngược lại nó sẽ gọi other mà bạn đã truyền vào sau đó trả về kết quả của Supplier. |
| 10 | <X extends Throwable> T orElseThrow(Supplier<? extends X> exceptionSupplier) Nếu như đối tượng Optional có giá trị tồn tại thì nó sẽ trả về giá trị đó, ngược lại sẽ ném ra một Exception do chúng ta định nghĩa bởi Supplier đã truyền vào. |
Stream là 1 lớp trừu tượng mới được giới thiệu trong Java 8 giúp ta giải quyết các bài toán về collections, array 1 cách tự nhiên hơn như thêm, sửa, xóa, lọc object…
SELECT SUM(salary) FROM Employee
Câu lệnh trên tự động trả về tổng lương của tất cả Employee mà không cần phải thực hiện bất kì tính toán gì ở phía đầu cuối developer (bình thường thì sẽ SELECT tất cả các Employeesau đó dùng code Java để duyệt và tính tổng của tất cả Employee).
Tương tự vấn đề trên, khi sử dụng Collections trong Java, chúng ta thực hiện các vòng lặp và thực hiện lại các đoạn kiểm tra.
Giả sử muốn tính tổng lương của các employee có role = ‘Developer’ từ 1 danh sách chúng ta phải thực hiện lặp tất cả các phần tử, kiểm tra phần tử đó có role = ‘Developer’ rồi cộng lại. Trong khi nếu muốn xử lý chúng song song lại dễ gặp lỗi.
public static final String ROLE_DEVELOPER = "Developer";
public double sumSalaryOfDeveloper(List<Employee> listEmployee) {
double sumSalary = 0;
for (Employee emp : listEmployee) {
if (emp.getRole().equals(ROLE_DEVELOPER)) {
sumSalary += emp.getSalary();
}
}
return sumSalary;
}
Để giải quyết vấn đề đó, Java 8 giới thiệu Stream API giúp developer xử lý dữ liệu khai báo và tận dụng kiến trúc đa lõi (multicore) mà không cần viết mã cụ thể cho nó.
public static final String ROLE_DEVELOPER = "Developer";
public double sumSalaryOfDeveloper(List<Employee> listEmployee) {
return listEmployee
.stream()
.filter(p -> p.getRole().equals(ROLE_DEVELOPER))
.mapToDouble(p -> p.getSalary()).sum();
}
Như vậy, bạn có thể hiểu stream đại diện cho một collection được xử lý tuần tự và hỗ trợ rất nhiều loại operation để tính toán dựa trên những element của collection đó (tính tổng, convert sang map, …)
Phần này sẽ giải thích rõ tại sao cú pháp Lambda Expression lại được viết như thế.
Sẽ bổ sung sau
Sẽ bổ sung sau
Phương thức main() trong chương trình Java chính là điểm thực thi của chương trình, hay còn là điểm vào (entry point) khi thực hiện một xử lý trong chương trình Java.
Phương thức main() kết thúc là khi chương trình kết thúc và phương thức main() là điều kiện để cho các phương thức khác có thể thực thi.
Con trỏ pointer không được sử dụng trong Java vì con trỏ khá phức tạp và không an toàn.
Java độc lập nền tảng là do Java sử dụng JVM, máy ảo Java cung cấp cách thực thi mã Java độc lập với nền tảng.
Package trong Java là một nhóm các lớp (class), giao diện (interface) và các package con tương tự.
Package thường được chia thành 2 loại:
Ưu điểm của các package:
class thuộc package nào khi được gọi ở phần access modifier.import.
import java.sql khi import tất cả các class.import.util.regex khi sử dụng class nằm trong package regex. Stack: có kích thước cố định tùy thuộc vào hệ điều hànhHeap: có kích thước không cố định, có thể tăng giảm tùy thuộc vào nhu cầuStack: Vùng nhớ được quản lý bằng hệ điều hành, dữ liệu được lưu sẽ tự động hủy sau khi hàm thực hiện xong nhiệm vụ của mình.Heap: Vùng nhớ được quản lý bằng lập trình viên và các dữ liệu sẽ không bị hủy sau khi hàm thực hiện xong và lập trình viên phải tự hủy vùng nhớ. Stack: Có khả năng vượt quá dung lượng lưu trữ vì dung lượng bộ nhớ Stack chỉ có hạn.Heap: Cũng có khả năng tràn vùng nhớ nếu bạn liên tục cấp phát vùng nhớ mà không giải phóng thường xuyên. contructor, trong block hoặc trong các phương thứccontructor và block. Bị phá hủy khi kết thúc phương thức, contructor và block.contructor và blockheapnew và bị phá hủy khi đối tượng bị phá hủycontructor, block, tuy nhiên phải được sử dụng qua một đối tượng cụ thểclassTừ khóa final trong Java là từ khóa được dùng để hạn chế số lượng người dùng.
Lập trình viên có thể sử dụng ở nhiều ngữ cảnh: phương thức method, biến variable, lớp class.
Final là thuộc tính mà chúng sẽ không thể thay đổi giá trị. Các phương thức final không thể overide ở lớp con và các class final không thể kế thừa.
Static trong Java là từ khóa dùng để quản lý bộ nhớ và truy cập trực tiếp thông qua lớp khi không cần khởi tạo.
Super trong Java là một biến tham chiếu, dùng để tham chiếu đến đối tượng của lớp cha gần nhất một cách trực tiếp.
String không thể thay đổi và không thể có class conStringBuffer và StringBuilder có thể thay đổi đượcStringBuffer và StringBuilder giống nhau, chỉ có điểm khác biệt khi sử dụng đa luồngStringBuilder là tốt nhất sau đó đến StringBuffer và String. Constructors (Hàm ảo) trong Java là một phương thức được sử dụng để khởi tạo, trả về các đối tượng của lớp.
Thông thường, một Constructors sẽ trùng tên với lớp mà nó được định nghĩa.
Lớp wrapper trong Java là lớp đóng gói các kiểu, cung cấp cơ chế chuyển đổi dữ liệu nguyên thủy trở thành kiểu đối tượng, và ngược lại. .
Không bắt buộc phải khai báo constructor trong lớp. Nếu không khai báo, lớp sẽ dùng default constructor.
Có 4 phạm vi truy cập trong Java là public, private, default và protected.
Public: Có thể truy cập mọi lúc mọi nơiPrivate: Chỉ có thể truy cập bên trong lớpDefault: Có thể truy cập từ trong lớp khai báo, các lớp cùng một gói với lớp khai báoProtected: Có thể truy cập trong lớp khai báo, các lớp con của lớp khai báo, các lớp cùng một gói với lớp khai báoTrình biên dịch JIT trong Java hay còn được biết đến với tên gọi Just-In-Time – là một kỹ thuật biên dịch các phần mã byte có các chức năng tương tự trong cùng một thời gian, qua đó giảm thời gian biên dịch cần thiết.
Constructor | Method |
|---|---|
| Được sử dụng để khởi tạo trạng thái của đối tượng. | Được sử dụng để thể hiện hành động của đối tượng. |
| Không có kiểu trả về. | Có kiểu trả về. |
| Constructor được gọi ngầm. | Phương thức được gọi tường minh. |
JIT tạo ra constructor mặc định nếu bạn không có constructor nào. | Phương thức không được tạo ra bởi JIT. |
| Tên của constructor phải giống tên lớp. | Tên phương thức có thể giống hoặc khác tên lớp. |
Từ khóa break dùng để thoát ra khỏi vòng lặp ngay lập tức và chuyển sang câu lệnh tiếp theo, ở ngoài vòng lặp vừa kết thúc.
Từ khóa continue được dùng để chỉ việc vòng lặp kế tiếp sẽ được thực hiện.
Lập trình hướng đối tượng (OOP) là một phương pháp lập trình máy tính tổ chức thiết kế phần mềm xung quanh dữ liệu hoặc đối tượng thao tác, thay vì chức năng và logic để thao tác chúng.
Lập trình hướng đối tượng dựa trên các nguyên lý sau:
Java không phải là ngôn ngữ hướng đối tượng hoàn toàn vì Java có sử dụng cả các loại dữ liệu khác như byte, char, float, v.v.
Những câu hỏi phỏng vấn Java thường gặp.
Giống nhau:
| Cơ sở so sánh | HashTable | HashMap |
|---|---|---|
| Cài đặt interface | Đều cài đặt interface List (thực tế là Map, không phải List) | Đều cài đặt interface List (thực tế là Map, không phải List) |
| Thứ tự phần tử | Duy trì theo thứ tự chèn các phần tử | Duy trì theo thứ tự chèn các phần tử |
Khác nhau:
| Cơ sở so sánh | Vector | ArrayList |
|---|---|---|
| Căn bản | Lớp Vector sẽ được đồng bộ hóa. | Lớp ArrayList sẽ không được đồng bộ hóa. |
| Lớp kế thừa | Vector là một lớp kế thừa, được thiết kế lại để hỗ trợ lớp Collection. | ArrayList là một lớp Collection tiêu chuẩn. |
| Tuyên bố lớp | Vector | ArrayList |
| Tái phân bổ | Khi không được chỉ định, Vector tăng lên gấp đôi kích thước. | Khi không được chỉ định, ArrayList tăng thêm một nửa kích thước. |
| Hiệu suất | Khi Vector được đồng bộ hóa, Vector hoạt động chậm hơn ArrayList. | Vì ArrayList không được đồng bộ hóa, ArrayList hoạt động nhanh hơn Vector. |
| Bảng liệt kê / lặp | Vector sử dụng Enumeration và giao diện Iterator để duyệt các phần tử. | ArrayList sử dụng giao diện Iterator để duyệt các phần tử. |
equals() và == trong JavaEquals() là một phương thức so sánh 2 object tuy nhiên chỉ so sánh về mặt giá trị của chúng. Trong phép so sánh equals(), nếu đúng sẽ trả về true, sai sẽ trả về false.== là phép so sánh 2 object có đang cùng trỏ vào một ô nhớ hay không. Trong phép ==, kết quả đúng sẽ trả về true, sai về false. Class đại diện cho các thuộc tính và phương thức chung cho các đối tượng của lớp. Trong Java, class là kiểu dữ liệu do lập trình viên tự tạo ra.
Học cách trả lời câu hỏi phỏng vấn Java để phỏng vấn hiệu quả.
| Cơ sở so sánh | Array (Mảng) | ArrayList |
|---|---|---|
| Kích thước | Có kích thước cố định – không thể thay đổi sau khi khai báo. | Có thể thay đổi kích thước động khi thêm hoặc xóa phần tử. |
| Thuộc loại | Cấu trúc dữ liệu cơ bản. | Lớp trong Java Collection Framework. |
Collection trong Java là khuôn khổ cung cấp kiến trúc lưu trữ và thao tác tới nhóm đối tượng. Bạn có thể thực hiện tất cả các hoạt động như tìm kiếm, chèn, phân loại, v.v, trên một dữ liệu nhờ Java Collection.
Các interface của Java Collection: Set, List, Queue, Deque, v.v.
Các class của Java Collection: ArrayList, Vector, LinkedList, HashSet, PriorityQueue, v.v.
Có 4 loại access modifier là: private, default, protected, public. Trong đó:
Polymorphism – Tính đa hình. Các đối tượng được thiết kế để chia sẻ các hành vi và chúng có thể có nhiều dạng. Chương trình sẽ xác định ý nghĩa hoặc cách sử dụng nào là cần thiết cho mỗi lần thực thi đối tượng đó từ lớp cha, giúp giảm nhu cầu sao chép mã.
Sau đó, một lớp con được tạo ra để mở rộng chức năng của lớp cha. Tính đa hình cho phép các loại đối tượng khác nhau đi qua cùng một giao diện.
Cách trả lời những câu hỏi phỏng vấn Java.
Trên đây chúng ta đã cùng tìm hiểu về những câu hỏi phỏng vấn Java thường gặp trong các buổi phỏng vấn. Bạn hãy tham khảo những câu hỏi này để có thể tự tin hơn khi đối diện với nhà tuyển dụng nhé.