---
# System prepended metadata

title: Câu hỏi phỏng vấn

---

Câu hỏi phỏng vấn
===

> [name=SANG chấn tâm lý]

## 5 câu cấu trúc dữ liệu và thuật toán

#### 1. Cho một mảng `a` là thể hiện của một số tự nhiên. Viết giải thuật để thêm 1 đơn vị vào `a`.
- Gọi số phần tử của mảng là `n`
- `1 <= n <= 1000`
- `0 <= a[i] <= 9`
```java=
// Code mẫu
// [1, 2, 3] tương đương 123, Kết quả mong muốn [1, 2, 4]

List<Integer> addOne(List<Integer> a) {
    return null;
}
```

#### 2. Cho một chuỗi ký tự, viết 1 hàm để đảo ngược chuỗi.

#### 3. Cho một chuỗi chỉ bao gồm các ký tự `(`, `)`, `[`, `]`, `{`, `}`. Viết hàm để kiểm tra chuỗi đó có là chuỗi các dấu ngoặc hợp lệ.
```java=
// Các ví dụ hợp lệ
// ([])
// ()([])
// {[()]()[]}

// Các ví dụ không hợp lệ
// ()] // Không mở mà đóng
// (] // Sai loại ngoặc đóng
// [(]) // Sai loại ngoặc đóng
```

```java=
// Cho một stack để giữ các loại ngoặc mở
// Khi gặp ngoặc mở thì bỏ vào stack
// Khi gặp ngoặc đóng thì kiếm tra, nếu stack trống => false (thiếu mở ngoặc)
// Nếu phần tử cuối không trùng loại ngoặc thì false
// Nếu ok hết thì pop
// Nếu tới cuối cùng mà stack đó vẫn còn => false (do dư mở ngoặc)
```

#### 4. Nguyên tắc hoạt động của `queue`. Cấu trúc dữ liệu dùng để cài đặt `queue`.

#### 5. Nguyên tắc hoạt động của `stack`. Cấu trúc dữ liệu dùng để cài đặt `stack`.

## 5 câu tổng quát

#### 1. Over load `method` trong lập trình là gì? Cho ví dụ
- Với cùng 1 tên `method` ta có thể truyền nhiều loại tham số đầu vào khác nhau như khác loại trong tham số đầu vào hay khác số lượng tham số đầu vào hoặc thứ tự các tham số đầu vào.
    - Ví dụ
        - `void add(String s)` ✅
        - `void add(Integer x)` ✅
        - `void add(Long theTiger)` ✅
        - `void add(Long theTiger, String s)` ✅
        - `void add(String s, Long theTiger)` ✅

#### 2. Tham chiếu và tham trị trong khi gọi hàm là gì? Hàm trong `Java` truyền tham chiếu hay tham trị? Cho ví dụ.
- Tham chiếu là kiểu truyền địa chỉ ô nhớ của dữ liệu vào trong hàm. Điều này chỉ sinh ra con trỏ đến dữ liệu mới được truyền vào trong biến tạm.
- Tham trị là kiểu truyền giá trị của ô nhớ của dữ liệu vào trong hàm. Điều này sinh ra một ô nhớ tạm và copy giá trị của dữ liệu truyền vào để hàm sử dụng.
- Trong `Java` thì các kiểu dữ liệu `char`, `byte`, `short`, `int`, `long`, `float`, `double`, `boolean` sẽ truyền theo kiểu tham trị. Các kiểu dữ liệu còn lại sẽ truyền tham chiếu.

#### 3. `String` vs `StringBuilder` trong `Java`. Khi nào cần sử dụng `StringBuilder`?

#### 4. Điểm khác biệt giữa `linked list` và `array`.

#### 5. `Contructor` trong `Java` là gì? Có mấy loại?
- Method gọi mặc định trong Java khi khởi tạo object. Ko có kiểu trả về và có tên trùng với tên class.
- Có 2 loại:
    - mặc định (không có tham số)
    - có tham số


## 5 câu lựa chọn

#### 1. Từ khóa public static trong Java khai báo như thế nào?
- [ ] public đứng trước static
- [ ] static đứng trước public
- [ ] thứ tự bất kỳ nhưng thường public trước
- [ ] tất cả đều sai

## 5 câu chạy chương trình ra kết quả

#### 1. Đoạn code sau cho ra kết quả gì?
```java=
// Java
Long a = new Long(1);
Long b = a + 0;
if (a == b) {
    System.out.println("a == b");
} else {
    System.out.println("a != b");
}
```
Kết quả:
```java=
a != b
```


#### 2. Đoạn code sau cho ra kết quả gì?
```java=
class Test
{
    public static void main (String args[])
    {
        System.out.println(10 + 20 + "Javatpoint");
        System.out.println("Javatpoint" + 10 + 20);
    }
}
```
Kết quả:
```java=
30Javatpoint
Javatpoint1020
```

#### 3. Đoạn code sau cho ra kết quả gì?
```java=
class Splendor extends Bike {
    void run() {
        System.out.println("running safely with 60km");
    }
    public static void main(String args[]) {
        Bike b = new Splendor(); //upcasting  
        b.run();
    }
}
class Bike {
    void run() {
        System.out.println("running");
    }
}
```
- Kết quả:
```java=
running safely with 60km
```
#### 4. Đoạn code sau cho ra kết quả gì?
```java=
class Test {
    public static void main(String args[]) {
        String s = "Java";
        s.concat(" is good.");
        System.out.println(s);
    }
}
```
Kết quả:
```java=
Java
```
#### 5. Đoạn code sau cho ra kết quả gì?
```java=
class Test {
    public static void main(String args[]) {
        String s = "One";
        s = "Another one"
        System.out.println(s);
    }
}
```
Kết quả:
```java=
Another one
```
---
## Một số câu hỏi tham khảo

#### 1. Over load `method` trong lập trình là gì? Cho ví dụ
- Với cùng 1 tên `method` ta có thể truyền nhiều loại tham số đầu vào khác nhau như khác loại trong tham số đầu vào hay khác số lượng tham số đầu vào hoặc thứ tự các tham số đầu vào.
    - Ví dụ
        - `void add(String s)` ✅
        - `void add(Integer x)` ✅
        - `void add(Long theTiger)` ✅
        - `void add(Long theTiger, String s)` ✅
        - `void add(String s, Long theTiger)` ✅

#### 2. Vì sao ta cần declare `private`, `public` trong Class?
- Để đảm bảo tính toàn vẹn của dữ liệu. Một biến `private` chỉ có thể được truy cập và chỉnh sửa trong cùng `class`, một biến `public` có thể được truy cập và chỉnh sửa ở đâu cũng được

#### 3. Phân biệt giữa `interface` và `class`.


#### 4. Viết hàm để đảo ngược một mảng cho trước và trả về mảng đó.
```java=
public List<Integer> reversed(List<Integer> a) {
    // Write your code here
    return a;
}
```

#### 5. `Contructor` trong `Java` là gì? Có mấy loại?
- Method gọi mặc định trong Java khi khởi tạo object. Ko có kiểu trả về và có tên trùng với tên class.
- Có 2 loại:
    - mặc định (không có tham số)
    - có tham số

#### 6. `==` vs `equals()` trong Java?

#### 7. Từ `new` trong Java dùng để làm gì?
- Dùng để tạo một `Object` mới trong Java và trả về địa chỉ của nó.

#### 8. Phân biệt giữa biến cục bộ (`local variable`) và biến toàn cục (`instance variable`).

#### 9. `contructor` vs `method`.

#### 10. `break` vs `continue`.

#### 11. Sự khác biệt giữa `static` method và `non-static` method.

#### 12. String trong Java `mutable` hay `immutable`? Vì sao?
- `Immutable` vì String cần đảm bảo tính toàn vẹn của giá trị trong String giữa nhiều máy trạm gọi đến 1 địa chỉ ref của String. Bởi vậy nên String được làm ra `Immutable`.

#### 13. Điều gì xảy ra khi ta cộng 2 chuỗi trong Java lại với nhau?
```java=
    String a = "Long the Tiger, ";
    a = a + "Bakuryu the Mole";
```
- `Java` sẽ tạo ra một chuỗi mới cho `"Bakuryu the Mole"`.
- Kết quả cuối cùng cũng sẽ là một `String` đc tạo mới bởi `java` có độ dài bẳng cả 2 chuỗi con + lại với nhau và gán vào biến a.

#### 14. `Array` vs `ArrayList`


| Array | ArrayList |
| -------- | -------- |
| Cannot contain values of different data types     | Can contain values of different data types.     |
|Size must be defined at the time of declaration    | Size can be dynamically changed |
|Need to specify the index in order to add data     | No need to specify the index|
|Arrays are not type parameterized|Arraylists are type |
|Arrays can contain primitive data types as well as objects|Arraylists can contain only objects, no primitive data types are allowed|


#### 15. Default `constructor` dùng để làm gì?
- Dùng để init giá trị của đối tượng được tạo.

#### 16. `this()` và `super()` dùng để làm gì?
- Cả 2 dùng để gọi `contructor`, `this()` dùng để gọi contructor của class hiện tại, `super()` dùng để gọi contructor của class cha.

#### 17. Singleton class là gì và làm sao ta có thể tạo được 1 singleton class?
- Là class mà nó chỉ tạo được một thể hiện của class đó trong một JVM.
- Cách tạo ra là làm cho `contructor` private và dùng 1 method `public static` để `get` cái thể hiện của class đó và dùng.

#### 18. Các tính chất của hướng đối tượng là gì? Ví dụ.

#### 19. `Static variable` khác với `variable` như thế nào?
- Static variable
    - Có 1 bản sao duy nhất được tạo ra, dù bạn có tạo bao nhiêu object từ class tương ứng
    - Lưu trưở bộ nhớ static riêng
    - Khởi tạo khi chương trình bắt đầu chạy, bị hủy chỉ khi chương trình dừng
    - Truy cập thông qua cú pháp `ClassName.staticVariableName`

#### 20. `Static method` là gì? `Static method` có khác gì so với `non-static method`?
- `Static method` thuộc về `class`, ko thuộc về `instance`
- `Static method` gọi mà ko cần new `class`
- `Static method` có thể gọi và thay đổi biến `static`

#### 21. `Biến static` với `biến static final` khác nhau điểm gì?
- Biến `static` thì lưu ở một chỗ cho tất cả các `object` xài chung 1 biến, tất cả các `object` đều có khả năng thay đổi `biến static`. `Static final` đánh dấu biến đó có thuộc tính giống như `static` nhưng có một điểm khác biệt là giá trị của `biến static final` không thể bị thay đổi.

#### 22. Từ khóa `this` là gì?
- Để chỉ `object` hiện tại trong 1 `method` hay `constuctor`
- Thường dùng để tránh sự nhầm lẫn giữa `biến toàn cục` và `tham số cục bộ` trong `method` hay `constructor`

#### 23. Có bao nhiêu kiểu dữ liệu trong `Java`?
- 2 kiểu
    - Nguyên thủy: `char`, `byte`, `short`, `long`, `int`, `boolean`, `float`, `double`
    - Đối tượng: phần còn lại đều là đối tượng

#### 24. Có thể override `static method` hay không?
- No.

#### 25. `Static variable` có lợi gì trong việc sử dụng so với `variable`? Trường hợp nào thì nên sử dụng `static variable`?
- Sử dụng hiệu quả bộ nhớ. `Static variable` chỉ tạo 1 lần khi chạy và tất cả các `object` được tạo từ `class` đều gọi chung 1 địa chỉ ô nhớ cho `static variable`.
- Trường hợp nên sử dụng: khi biến dùng để chứa dữ liệu dùng chung cho tất cả các `object` cùng loại, như tổng số học sinh

---
#### 1. Cho một mảng, viết hàm để kiểm tra mảng đó có đối xứng hay không.
- Đối xứng là khi đảo ngược cả mảng vẫn ra mảng đó

```java=
// Các mảng đối xứng
[]
[1]
[1, 2, 3, 2, 1]
[1, 2, 3, 3, 2, 1]

// Các mảng không đối xứng
[1, 2, 3]

```

#### 2. Viết hàm merge 2 mảng đã sắp xếp rồi thành 1 mảng.
```java=
a = [1, 2, 3]
b = [4, 4]
```
#### 3. Cho một số tự nhiên lớn hơn hoặc bằng 0, viết hàm để trả về dạng biểu diễn nhị phân 8 `bit` của số đó.
```java=
// Cho số: 3
// Trả về: 00000011

// Cho số: 5
// Trả về: 00001010
```