Trang chủHướng dẫnString Pool trong Java là gì? Hiểu rõ cách hoạt động và tối ưu bộ nhớ
Java

String Pool trong Java là gì? Hiểu rõ cách hoạt động và tối ưu bộ nhớ

CyStack blog 3 phút để đọc
CyStack blog30/07/2025
Locker Avatar

Bao Tran

Web Developer

Locker logo social
Reading Time: 3 minutes

Đúng như tên gọi của nó, String pool trong Java là một vùng chứa các đối tượng String được lưu trữ trong bộ nhớ heap. Như ta đã biết, String là một class đặc biệt và chúng ta có thể tạo đối tượng String bằng toán tử new hoặc bằng cách gán giá trị trực tiếp trong dấu ngoặc kép.

String Pool trong Java

String pool trong Java

Sơ đồ dưới đây minh họa rõ ràng cách String pool được duy trì trong vùng nhớ heap của Java, cũng như những gì xảy ra khi chúng ta tạo String với các cách khác nhau.

Sơ đồ String pool trong Java

String pool có thể tồn tại là nhờ vào tính bất biến (immutable) của String trong Java và việc triển khai khái niệm String interning (phương pháp tối ưng lưu trữ String giống nhau chung một chỗ, không trùng lặp). Đây cũng là một ví dụ của mẫu thiết kế Flyweight. String pool giúp ta tiết kiệm rất nhiều dung lượng bộ nhớ cho Java Runtime mặc dù việc tạo String có thể tốn nhiều thời gian hơn.

Khi ta dùng dấu ngoặc kép để tạo một String, Java trước tiên sẽ tìm kiếm trong String pool một String có cùng giá trị. Nếu tìm thấy, nó chỉ trả về tham chiếu đến đối tượng đã có. Ngược lại, nó sẽ tạo một String mới trong pool rồi trả về tham chiếu của đối tượng mới đó.

Tuy nhiên, khi sử dụng toán tử new, chúng ta buộc class String phải tạo một đối tượng String mới trong vùng nhớ heap. Chúng ta có thể dùng phương thức intern() để đưa một String được tạo bằng new vào trong pool, hoặc để lấy tham chiếu đến một đối tượng String có cùng giá trị từ pool.

Dưới đây là chương trình Java minh họa cho sơ đồ về String pool ở trên:

package com.journaldev.util;

public class StringPool {

    /**
     * Java String Pool example
     * @param args
     */
    public static void main(String[] args) {
        String s1 = "Cat";
        String s2 = "Cat";
        String s3 = new String("Cat");
        
        System.out.println("s1 == s2 :"+(s1==s2));
        System.out.println("s1 == s3 :"+(s1==s3));
    }

}

Output của chương trình:

s1 == s2 :true
s1 == s3 :false

Có bao nhiêu String được tạo ra trong String pool?

Trong các buổi phỏng vấn về Java, đôi khi bạn sẽ gặp câu hỏi liên quan đến String pool. Ví dụ, có bao nhiêu chuỗi string được tạo ra trong câu lệnh dưới đây?

String str = new String("Cat");

Với câu lệnh trên, sẽ có 1 hoặc 2 đối tượng string được tạo ra. Nếu string literal (chuỗi nguyên bản) “Cat” đã tồn tại trong pool, thì chỉ có một đối tượng String mới được tạo ra trên heap (và được gán cho biến str).

Nếu string literal “Cat” chưa có trong pool, thì đầu tiên nó sẽ được tạo trong pool, sau đó một đối tượng String khác sẽ được tạo trên vùng nhớ heap. Như vậy, tổng cộng sẽ có 2 đối tượng String được tạo ra.

Tổng kết

String pool là một phần không thể thiếu trong cơ chế quản lý chuỗi của Java, giúp tái sử dụng các đối tượng String nhằm nâng cao hiệu quả sử dụng bộ nhớ. Bạn nên chủ động áp dụng kiến thức này trong code để tránh tạo thừa nhiều đối tượng String. Nếu gặp khó khăn hoặc muốn tìm hiểu sâu hơn về String pool, đừng ngần ngại để lại câu hỏi của bạn bên dưới.

0 Bình luận

Đăng nhập để thảo luận

Chuyên mục Hướng dẫn

Tổng hợp các bài viết hướng dẫn, nghiên cứu và phân tích chi tiết về kỹ thuật, các xu hướng công nghệ mới nhất dành cho lập trình viên.

Đăng ký nhận bản tin của chúng tôi

Hãy trở thành người nhận được các nội dung hữu ích của CyStack sớm nhất

Xem chính sách của chúng tôi Chính sách bảo mật.

Đăng ký nhận Newsletter

Nhận các nội dung hữu ích mới nhất