NỘI DUNG BÀI VIẾT
1. String pool là gì?
- String pool là một vùng nhớ đặc biệt nằm trong vùng nhớ Heap (Heap memory), dùng để lưu trữ các biến được khai báo theo kiểu String.
- String pool giúp tối ưu hoá việc lưu trữ và sử dụng vùng nhớ khi khai báo biến String, giúp hạn chế tình trạng tràn bộ nhớ Java Heap Space.
2. String pool và cách thức làm việc
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));
}
}
Code language: JavaScript (javascript)
Ouput
s1 == s2 :true
s1 == s3 :false
Code language: JavaScript (javascript)
- Khi sử dụng double quotes: Java sẽ truy cập vào String Pool, rồi tìm ở trong Pool ô nhớ nào có cùng giá trị với nó, nếu tìm thấy thì sẽ tham chiếu đến địa chỉ của ô nhớ đó, còn không thì nó sẽ tạo ô nhớ mới ở trong Pool rồi sẽ thực hiện việc tham chiếu.
Ở ví dụ trên, khai báo biến String s1 = “Cat”; nó sẽ tạo mới trong String Pool một ô nhớ có giá trị là “Cat” vì lúc này ở trong Pool chưa có ô nhớ nào giá trị đó.
Lúc khai báo String s2 = “Cat”; nó tìm thấy trong Pool giá trị một ô nhớ có giá trị là “Cat “, s2 chỉ việc tham chiếu đến địa chỉ của ô nhớ này. Như vậy s2 đã có giá trị là “Cat” nhờ vào việc tham chiếu mà không cần phải tạo 1 ô nhớ khác.
Vì s1 và s2 cùng tham chiếu đến cùng một địa chỉ ô nhớ vùng nhớ heap nến s1 == s2
- Khi sử dụng toán tử new, thì Java sẽ không tạo ô nhớ mới ở bộ nhớ String Pool mà sẽ tạo ở Java Heap Space. Và khi đó nó sẽ luôn luôn tạo ô nhớ mới cho dù đã có sẵn những ô nhớ khác có cùng giá trị.
Ở ví dụ trên: String s3 = new String(“s3”); dòng này sẽ tạo 1 ô nhớ ở Java Heap Space có giá trị là “s3”, biến s3 này sẽ tham chiếu địa chỉ của ô nhớ đó.
Và nếu có: String s4 = new String(“s3”); tương tự dòng này cũng sẽ tạo 1 ô nhớ khác ở Java Heap Space cũng có giá trị là “s3” (không giống ở trên là sẽ tìm ô nhớ nào có giá trị như vậy rồi tham chiếu đến nhé), biến s4 này sẽ tham chiếu đến địa chỉ của ô nhớ mới.
Và vì s3 và s4 ko tham chiếu đến cùng địa chỉ ô nhớ ở vùng nhớ heap nên s3 != s4
=> Khai báo theo cách sử dụng toán tử new sẽ nhanh hơn cách dùng double quotes vì nó ko kiểm tra sự tồn tại của ô nhớ trong Head space để tham chiếu đến như dùng double quotes. Thay vì đó nó sẽ luôn tạo những ô nhớ mới việc này dẫn đến dư thừa, nếu ko tinh ý để quản lý thì sẽ dễ dàng tràn bộ nhớ ở Head space.
Vấn đề tràn bộ nhớ Java Heap Space thì chỉ có ở máy tính có RAM thấp thôi, bây giờ máy đời mới rồi nên cũng hiếm gặp lắm, đối với developer khi làm việc với vấn đề tạo ra rất nhiều nhiều String đối khi sẽ gặp phải vấn đề này
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.
Happy learning!!!