Java-Interview

You might also like

Download as docx, pdf, or txt
Download as docx, pdf, or txt
You are on page 1of 12

Kiến thức Java cơ bản

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.

public class Person {


private String name;
private int age;

public String getName() {


return name;
}

public void setName(String name) {


this.name = name;
}

public int getAge() {


return age;
}

public void setAge(int age) {


this.age = age;
}
}

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.

public class Animal {


public void eat() {
System.out.println("Animal eats");
}
}

public class Dog extends Animal {


public void bark() {
System.out.println("Dog barks");
}
}

3. Polymorphism (Đa hình): Cho phép một phương thức có nhiều hình thức khác
nhau.

public class Animal {


public void makeSound() {
System.out.println("Animal makes sound");
}
}

public class Dog extends Animal {


@Override
public void makeSound() {
System.out.println("Dog barks");
}
}

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.

public abstract class Animal {


public abstract void makeSound();
}

public class Dog extends Animal {


@Override
public void makeSound() {
System.out.println("Dog barks");
}
}

Sự khác nhau giữa while và do-while?

 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.

Set<String> set = new HashSet<>();


set.add("A");
set.add("B");

 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.

Map<String, Integer> map = new HashMap<>();


map.put("A", 1);
map.put("B", 2);

 Queue: Một cấu trúc dữ liệu theo kiểu FIFO (First In, First Out). Ví dụ: LinkedList,
PriorityQueue.

Queue<String> queue = new LinkedList<>();


queue.add("A");
queue.add("B");

 Stack: Một cấu trúc dữ liệu theo kiểu LIFO (Last In, First Out). Ví dụ: Stack.

Stack<String> stack = new Stack<>();


stack.push("A");
stack.push("B");

Phân biệt ArrayList, LinkedList và Vector?

 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ử.

List<String> arrayList = new ArrayList<>();


arrayList.add("A");

 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.

List<String> linkedList = new LinkedList<>();


linkedList.add("A");
 Vector: Tương tự như ArrayList nhưng được đồng bộ hóa, vì vậy nó an toàn khi sử
dụng trong môi trường đa luồng, nhưng hiệu suất có thể kém hơn.

List<String> vector = new Vector<>();


vector.add("A");

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");
}
}

class Child extends Parent {


@Override
public void display() {
System.out.println("Child display");
}
}

public class Main {


public void display(int value) {
System.out.println("Display with value: " + value);
}

public void display(String text) {


System.out.println("Display with text: " + text);
}
}

Khái niệm về Generic? Cho ví dụ và lý do sử dụng?


 Generic: Là một tính năng của Java cho phép bạn định nghĩa lớp, phương thức hoặc giao
diện với kiểu dữ liệu được chỉ định khi sử dụng. Điều này giúp đảm bảo tính toàn vẹn
kiểu và giảm lỗi thời gian biên dịch.

public class Box<T> {


private T content;

public void setContent(T content) {


this.content = content;
}

public T getContent() {
return content;
}
}

public class Main {


public static void main(String[] args) {
Box<String> stringBox = new Box<>();
stringBox.setContent("Hello");
System.out.println(stringBox.getContent());
}
}

Sự khác nhau giữa Abstract class và Interface?

 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.

public abstract class Animal {


public abstract void makeSound();
}

public interface Swimmable {


void swim();
}

public class Duck extends Animal implements Swimmable {


@Override
public void makeSound() {
System.out.println("Quack");
}

@Override
public void swim() {
System.out.println("Duck swims");
}
}

Khái niệm tham trị và tham chiếu?

 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.

public void changeValue(int value) {


value = 10;
}

public static void main(String[] args) {


int number = 5;
changeValue(number);
System.out.println(number); // Output: 5
}

 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.

public void changeValue(int[] values) {


values[0] = 10;
}

public static void main(String[] args) {


int[] array = {5};
changeValue(array);
System.out.println(array[0]); // Output: 10
}

Ngoại lệ (Exception) là gì? Phân biệt Checked và Unchecked exception?

 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.

public int binarySearch(int[] array, int target) {


int left = 0;
int right = array.length - 1;

while (left <= right) {


int mid = left + (right - left) / 2;

if (array[mid] == target) {
return mid;
}

if (array[mid] < target) {


left = mid + 1;
} else {
right = mid - 1;
}
}

return -1; // Not found


}

 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];

System.arraycopy(array, left, L, 0, n1);


System.arraycopy(array, mid + 1, R, 0, 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++];
}
}

while (i < n1) {


array[k++] = L[i++];
}

while (j < n2) {


array[k++] = R[j++];
}
}

Kiến thức về Git

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.

Sự khác nhau giữa pull request và branch?


 Pull Request: Yêu cầu hợp nhất (merge) các thay đổi từ một nhánh vào một nhánh khác
trong repository. Thường dùng để yêu cầu xem xét mã trước khi hợp nhất vào nhánh
chính.
 Branch: Một nhánh trong repository cho phép bạn phát triển tính năng hoặc sửa lỗi mà
không làm ảnh hưởng đến mã nguồn chính.

Làm thế nào để revert previous commit trong git?

 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.

git revert <commit-hash>

Giải thích những ưu điểm của Forking Workflow?

 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.

Sự khác nhau giữa HEAD, working tree và index?

 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.

Trình bày quy trình làm việc của Gitflow Workflow?

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.

Khi nào nên sử dụng git stash?

 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 rm --cached filename

Khi nào nên sử dụng git rebase thay vì git merge?

 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 rebase master

 Git Merge: Hợp nhất hai nhánh mà không thay đổi lịch sử commit.

Kiến thức về Framework (Spring Framework)

Mô hình MVC là gì? Mô tả luồng đi của một ứng dụng MVC?

 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.

Luồng đi của ứng dụng MVC:

1. Người dùng gửi yêu cầu đến Controller.


2. Controller xử lý yêu cầu và tương tác với Model.
3. Model trả về dữ liệu cho Controller.
4. Controller chọn View phù hợp và gửi dữ liệu đến View.
5. View hiển thị dữ liệu cho người dùng.

Các khái niệm về Dependency Injection, JPA, ORM mapping, Webservice?

 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.

Giải thích các annotation @Controller, @Service, @Repository, @Autowire?

 @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;
}

Chức năng hoạt động của Maven?

 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>

Sự khác nhau của Session và Cookie?

 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");

You might also like