String và String Pool trong Java

1. String là gì?

Chúng ta chắc hẳn đã rất quen thuộc với String khi code Java. Với định nghĩa String từ Oracle như sau:

Strings, which are widely used in Java programming, are a sequence of characters. In the Java programming language, strings are objects

Có một vài chú ý với String như sau:

  • String là 1 reference type
  • Là immutable (không thể thay đổi được giá trị, ô chỉ nhớ của n)
  • Có thể tạo mới 1 String theo 2 cách:
    • String literal
    • new operator

Bài toán đặt ra: vì String là immutable, khi tạo quá nhiều String, liệu có dễ xảy ra tràn bộ nhớ Heap không?

Câu trả lời chính là String Pool

2. String Pool là gì?

  • String Pool là 1 phân vùng nhỏ nằm trong bộ nhớ Heap chứa các Strings.
  • Nó được tạo ra với mục đích tối ưu lưu trữ và dùng vùng nhớ khi khai báo String từ đó giúp hạn chế tình trạng tràn bộ nhớ Heap

3. Cách hoạt động của String Pool

a. Tạo String mới bằng String literal

JVM sẽ check trong String pool xem có ô nhớ nào có giá trị giống với giá trị cần tạo hay không? Nếu tồn tại trong pool rồi nó sẽ tham chiếu đến ô chỉ nhớ vừa tìm được, ngược lại, nếu không tìm thấy ô nhớ nào có giá trị giống giá trị cần tạo, JVM sẽ lưu giá trị mới vào trong pool và tiến hành trỏ vào ô chỉ nhớ mới tạo đó.

Ví dụ:

String s1 = “java”;

String s2 = “java”;

  • Khi khai báo s1, JVM tìm kiếm trong pool và không thấy có ô nhớ nào có giá trị là “java” cả. JMV sẽ tạo mới 1 ô nhớ trong pool có giá trị là “java”
  • Khi khai báo s2, JVM tìm kiếm trong pool và thấy có 1 ô nhớ có giá trị là “java” được JVM tạo ra trước đó khi khai báo s1. Vì thế JVM sẽ trỏ s2 vào ô chỉ nhớ vừa tìm được thay vì tạo ra 1 ô nhớ mới

Chính vì thế khi so sánh s1 == s2 //true

b. Tạo String mới bằng new operator

JVM sẽ luôn tạo ra 1 ô nhớ mới trong Heap memory (dù đã tồn tại những ô nhớ có cùng giá trị)

Ví dụ:

String s3 = new String(“java”);

String s4 = new String(“java”);

  • Khi khai báo s3 hay s4, JVM luôn luôn tạo ra 2 ô nhớ khác nhau trong Heap memory để tham chiếu đến.

Vì thế: s3 == s4 //false

c. Chúng ta nên tạo mới 1 String bằng cách nào?

Chúng ta nên tạo mới 1 String bằng String literal vì chúng dễ đọc, ngắn gọn, tăng khả năng optimize của JVM. (mặc dù tạo bằng new operator sẽ nhanh hơn vì không phải kiểm tra trong String Pool)

4. Tổng kết

Qua bài viết này, tôi muốn chia sẻ đến các bạn 1 chút kiến thức cơ bản về Java. Hi vọng sẽ giúp ích cho bạn đọc

Add a Comment

Scroll Up