Professional Documents
Culture Documents
Java-Interview
Java-Interview
Java-Interview
Lập trình đối tượng là gì? Các tính chất đặc thù của lập trình hướng đối tượng?
Lập trình đối tượng là một phương pháp lập trình dựa trên các đối tượng và lớp. Đối
tượng là các thực thể chứa dữ liệu (trạng thái) và các phương thức (hành vi) liên quan.
Các tính chất đặc thù:
1. Encapsulation (Đóng gói): Đóng gói dữ liệu và phương thức lại với nhau trong
một lớp, chỉ cho phép truy cập dữ liệu thông qua các phương thức công khai.
2. Inheritance (Kế thừa): Cho phép một lớp kế thừa các thuộc tính và phương thức
từ một lớp khác.
3. Polymorphism (Đa hình): Cho phép một phương thức có nhiều hình thức khác
nhau.
4. Abstraction (Trừu tượng): Cung cấp một giao diện đơn giản và ẩn đi chi tiết
phức tạp của hệ thống.
while loop: Kiểm tra điều kiện trước khi thực thi khối lệnh. Nếu điều kiện sai ngay từ
đầu, khối lệnh sẽ không được thực thi.
int i = 0;
while (i < 5) {
System.out.println(i);
i++;
}
do-while loop: Thực thi khối lệnh ít nhất một lần, sau đó kiểm tra điều kiện. Khối lệnh
được thực thi cho đến khi điều kiện sai.
int i = 0;
do {
System.out.println(i);
i++;
} while (i < 5);
Cách tổ chức hoạt động của các Collection Framework như List, Map, Set, Queue, Stack?
List: Một tập hợp các phần tử có thứ tự, có thể chứa các phần tử trùng lặp. Ví dụ:
ArrayList, LinkedList.
List<String> list = new ArrayList<>();
list.add("A");
list.add("B");
Set: Một tập hợp các phần tử không có thứ tự và không chứa các phần tử trùng lặp. Ví
dụ: HashSet, TreeSet.
Map: Một tập hợp các cặp khóa-giá trị, không chứa các khóa trùng lặp. Ví dụ: HashMap,
TreeMap.
Queue: Một cấu trúc dữ liệu theo kiểu FIFO (First In, First Out). Ví dụ: LinkedList,
PriorityQueue.
Stack: Một cấu trúc dữ liệu theo kiểu LIFO (Last In, First Out). Ví dụ: Stack.
ArrayList: Cung cấp truy cập nhanh đến các phần tử thông qua chỉ số, nhưng chèn và
xóa phần tử có thể chậm hơn vì cần dịch chuyển các phần tử.
LinkedList: Cung cấp hiệu suất tốt hơn cho các thao tác chèn và xóa vì không cần dịch
chuyển các phần tử, nhưng truy cập phần tử thông qua chỉ số có thể chậm hơn.
Sự khác nhau giữa ArrayList và Array, LinkedList và ArrayList, Set và List, Override
và Overload?
ArrayList vs Array:
o ArrayList có thể thay đổi kích thước động, trong khi Array có kích thước cố
định.
o ArrayList cung cấp nhiều phương thức tiện ích hơn.
LinkedList vs ArrayList:
o LinkedList tối ưu cho các thao tác chèn và xóa, trong khi ArrayList tối ưu cho
truy cập phần tử qua chỉ số.
Set vs List:
o Set không cho phép phần tử trùng lặp và không duy trì thứ tự, trong khi List cho
phép phần tử trùng lặp và duy trì thứ tự.
Override vs Overload:
o Override: Thay đổi cài đặt của phương thức kế thừa từ lớp cha.
o Overload: Tạo nhiều phương thức với cùng tên nhưng khác tham số.
class Parent {
public void display() {
System.out.println("Parent display");
}
}
public T getContent() {
return content;
}
}
Abstract class:
o Có thể chứa các phương thức đã triển khai và phương thức trừu tượng.
o Có thể có thuộc tính.
o Một lớp chỉ có thể kế thừa từ một lớp trừu tượng.
Interface:
o Chỉ chứa các phương thức trừu tượng (trừ Java 8, cũng có thể chứa phương thức
mặc định và static).
o Không có thuộc tính, chỉ có các hằng số.
o Một lớp có thể triển khai nhiều giao diện.
@Override
public void swim() {
System.out.println("Duck swims");
}
}
Tham trị: Khi truyền tham số theo kiểu tham trị, giá trị của tham số được sao chép. Thay
đổi giá trị của tham số trong phương thức không ảnh hưởng đến giá trị gốc.
Tham chiếu: Khi truyền tham số theo kiểu tham chiếu, địa chỉ của tham số được sao
chép. Thay đổi giá trị của tham số trong phương thức ảnh hưởng đến đối tượng gốc.
Exception: Là các sự kiện bất thường xảy ra trong quá trình thực thi chương trình, làm
gián đoạn dòng chảy của chương trình.
Checked Exception: Là các ngoại lệ mà bạn phải xử lý hoặc khai báo trong phương
thức. Ví dụ: IOException, SQLException.
try {
FileInputStream file = new FileInputStream("file.txt");
} catch (IOException e) {
e.printStackTrace();
}
Unchecked Exception: Là các ngoại lệ không bắt buộc phải xử lý. Ví dụ:
NullPointerException, ArrayIndexOutOfBoundsException.
public static void main(String[] args) {
int[] array = new int[5];
System.out.println(array[10]); // Throws
ArrayIndexOutOfBoundsException
}
Thuật toán tìm kiếm nhị phân và thuật toán sắp xếp?
Tìm kiếm nhị phân: Là một thuật toán tìm kiếm nhanh cho các mảng đã được sắp xếp.
Tìm kiếm được thực hiện bằng cách chia đôi mảng và kiểm tra giá trị ở giữa.
if (array[mid] == target) {
return mid;
}
Sắp xếp:
o Bubble Sort: Sắp xếp bằng cách so sánh và hoán đổi các phần tử liên tiếp.
java
Sao chép mã
public void bubbleSort(int[] array) {
int n = array.length;
for (int i = 0; i < n - 1; i++) {
for (int j = 0; j < n - i - 1; j++) {
if (array[j] > array[j + 1]) {
int temp = array[j];
array[j] = array[j + 1];
array[j + 1] = temp;
}
}
}
}
o Merge Sort: Là thuật toán sắp xếp phân tách và chinh phục, chia mảng thành các
phần nhỏ hơn và sau đó hợp nhất chúng lại.
java
Sao chép mã
public void mergeSort(int[] array, int left, int right) {
if (left < right) {
int mid = left + (right - left) / 2;
mergeSort(array, left, mid);
mergeSort(array, mid + 1, right);
merge(array, left, mid, right);
}
}
private void merge(int[] array, int left, int mid, int right) {
int n1 = mid - left + 1;
int n2 = right - mid;
int[] L = new int[n1];
int[] R = new int[n2];
int i = 0, j = 0;
int k = left;
while (i < n1 && j < n2) {
if (L[i] <= R[j]) {
array[k++] = L[i++];
} else {
array[k++] = R[j++];
}
}
Git fork là gì? Sự khác nhau giữa git fork, branch và clone?
Fork: Tạo bản sao của một repository trên tài khoản GitHub của bạn. Thường dùng để
làm việc trên các dự án mã nguồn mở mà bạn không có quyền truy cập trực tiếp.
Branch: Tạo một nhánh mới trong cùng một repository để phát triển tính năng mới mà
không làm ảnh hưởng đến mã nguồn chính (main branch).
Clone: Tạo bản sao đầy đủ của một repository trên máy tính của bạn để bạn có thể làm
việc offline.
Revert: Tạo một commit mới để đảo ngược các thay đổi từ commit trước đó mà không
xóa lịch sử commit.
Tăng cường an toàn: Giúp làm việc độc lập với mã nguồn chính mà không ảnh hưởng
đến các dự án chính.
Hỗ trợ phát triển song song: Cho phép nhiều người làm việc trên các tính năng khác
nhau mà không xung đột với nhau.
Dễ dàng xem xét mã: Pull request từ fork cho phép cộng đồng xem xét và thảo luận về
mã trước khi hợp nhất vào dự án chính.
HEAD: Tham chiếu đến commit hiện tại trên nhánh đang hoạt động.
Working Tree: Các tập tin trong thư mục làm việc hiện tại của bạn.
Index: (Hoặc Staging Area) Nơi các thay đổi được chuẩn bị trước khi commit.
1. Feature Branch: Phát triển tính năng mới trên nhánh feature.
2. Develop Branch: Kết hợp các nhánh feature vào nhánh develop để thử nghiệm và tích
hợp.
3. Release Branch: Chuẩn bị cho phát hành, kiểm tra và sửa lỗi.
4. Master Branch: Chứa phiên bản ổn định của mã nguồn đã phát hành.
5. Hotfix Branch: Sửa lỗi khẩn cấp trên nhánh master.
Git Stash: Được sử dụng để tạm thời lưu các thay đổi hiện tại mà không commit, cho
phép bạn chuyển sang một nhánh khác mà không mất đi các thay đổi chưa hoàn thành.
git stash
git stash pop
Làm thế nào để loại bỏ một tập tin từ git mà không cần loại bỏ nó khỏi file system của bạn?
git rm --cached: Xóa tập tin khỏi Git nhưng giữ lại nó trong hệ thống tập tin.
Git Rebase: Thay đổi cơ sở của nhánh hiện tại để nằm trên nhánh khác, giúp giữ cho lịch
sử commit sạch hơn và dễ hiểu hơn.
Git Merge: Hợp nhất hai nhánh mà không thay đổi lịch sử commit.
Mô hình MVC (Model-View-Controller) là một mẫu thiết kế phần mềm chia ứng dụng
thành ba phần:
1. Model: Xử lý dữ liệu và logic nghiệp vụ.
2. View: Hiển thị dữ liệu từ Model cho người dùng.
3. Controller: Xử lý yêu cầu của người dùng và cập nhật Model và View.
Dependency Injection (DI): Kỹ thuật cung cấp phụ thuộc cho đối tượng mà không cần
tự tạo chúng. Sử dụng để giảm phụ thuộc cứng và tăng tính linh hoạt của ứng dụng.
@Component
public class Service {
private final Repository repository;
@Autowired
public Service(Repository repository) {
this.repository = repository;
}
}
JPA (Java Persistence API): API trong Java để làm việc với cơ sở dữ liệu, hỗ trợ ánh xạ
các đối tượng Java với bảng cơ sở dữ liệu.
ORM (Object-Relational Mapping): Kỹ thuật ánh xạ các đối tượng trong Java với bảng
trong cơ sở dữ liệu, giúp làm việc với dữ liệu dễ dàng hơn.
Webservice: Một dịch vụ web cho phép các ứng dụng giao tiếp với nhau qua mạng. Ví
dụ: RESTful và SOAP web services.
@Controller: Đánh dấu lớp là một Controller trong Spring MVC, xử lý yêu cầu HTTP
và trả về các mẫu View.
@Controller
public class MyController {
@RequestMapping("/home")
public String home() {
return "home";
}
}
@Service: Đánh dấu lớp là một Service, chứa logic nghiệp vụ.
@Service
public class MyService {
public void performService() {
// Business logic
}
}
@Repository: Đánh dấu lớp là một Repository, xử lý tương tác với cơ sở dữ liệu.
@Repository
public class MyRepository {
public void save(Entity entity) {
// Save entity to database
}
}
@Autowire: Tự động tiêm (inject) các phụ thuộc vào các lớp trong Spring.
@Controller
public class MyController {
@Autowired
private MyService myService;
}
Maven: Công cụ quản lý dự án và xây dựng, sử dụng file pom.xml để định nghĩa các phụ
thuộc, plugin, và thông tin dự án.
xml
<dependencies>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-core</artifactId>
<version>5.3.9</version>
</dependency>
</dependencies>
Session:
o Lưu trữ dữ liệu trên server.
o Dữ liệu có thể lớn hơn và bảo mật hơn.
o Thường sử dụng để lưu trữ thông tin phiên làm việc của người dùng.
Cookie:
o Lưu trữ dữ liệu trên client (trình duyệt).
o Dữ liệu có kích thước hạn chế và có thể bị chỉnh sửa bởi người dùng.
o Thường sử dụng để lưu trữ thông tin người dùng như tùy chọn giao diện.
// Cookie example
Cookie cookie = new Cookie("username", "JohnDoe");
response.addCookie(cookie);
// Session example
HttpSession session = request.getSession();
session.setAttribute("username", "JohnDoe");