String Pool trong Java

Mình mới học Java, có một thắc mắc nhỏ nhờ mấy bạn giải đáp dùm, đây là Source Code:

String a = "dmcs";
String b = new String();
b = "dmcs";
System.out.print(a == b)

Kết quả: True

String a = "dmcs";
String b = new String("dmcs");
System.out.print(a == b);

Kết quả: false

Vậy sự khác nhau của việc khai báo một String rỗng sau đó gán cho nó bằng một biến kiểu String khác và việc gán cho nó ngay từ đầu là gì, như ở câu b mình kiểm tra hashCode của cả a và b là bằng nhau, vậy tại sao hai biến đó lại tham chiếu đến hai biến khác nhau (theo mình hiểu thì Java sử dụng String Pool, 2 biến tham chiếu đến 2 String hoàn toàn giống nhau thì cùng địa chỉ với nhau)

String Pool chỉ có trong trường hợp bạn gán cụ thể một chuỗi vào biến String thôi nhé. Ở ví dụ đầu khi bạn gán b = “dmcs” tức là nó đã vứt cái tham chiếu của object String mới tạo kia đi và gán vào chuỗi cụ thể là “dmcs” có trong String Pool

1 Like

hashCode bằng nhau vì chuỗi của nó có giá trị bằng nhau. Khi bạn gán chuỗi cụ thể thì nó mới nằm trong String pool để dùng khi trùng giá trị, còn nếu bạn dùng new để tạo Object thì nó sẽ là từng Object riêng rẽ, không liên quan gì đến String pool cả.

2 Likes

String literal được lưu trong String common pool

được lưu trong heap.

Bởi vì Java string là immutable bởi vậy khi gán mới nó sẽ được lưu trong vùng nhớ mới.
Mà do String pool đã lưu giá trị này nên nó refer đến String pool

1 Like

Bạn có thể chỉ rõ cho mình biết khi mình new String(“dmcs”); thì nó lưu biến này trong vùng nào không, chắc là không phải String common pool phải không?

Mình hiểu rồi. Cảm ơn bạn rất nhiều

Toán tử “==” là dùng để kiểm tra tham chiếu của a và b.

String a = "dmcs"; /// giả sử a lúc đó tham chiếu tới #51234
String b = new String("dmcs"); // lúc này, đối tượng tạm thời sẽ được tạo ra, temp sẽ tham chiếu tới #51234, và b lúc này sẽ tham chiếu tới temp tức là #62315.

Do vậy toán tử “==” trả về false là đúng rồi

1 Like
83% thành viên diễn đàn không hỏi bài tập, còn bạn thì sao?